Shell-Script

如何在 case 語句中使用程序替換而不會出現語法錯誤?

  • January 8, 2015

我在 /etc/init.d/myfile 中有一個腳本作為服務載入

當我嘗試啟動服務時出現錯誤

/etc/init.d/myservice: 21: /etc/init.d/myservice: Syntax error: "(" unexpected

問題似乎在於源命令中的程序替換 <(。我在其他腳本中使用它沒有任何問題從我的主配置文件中提取變數,但在一個案例語句中我不知道如何使它工作。

我的服務包含:

#!/bin/sh
#/etc/init.d/myservice

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: my service
# Description:       Start the myservice service
### END INIT INFO

case "$1" in
 start)
   # start processes
       # Import the following variables from config.conf: cfgfile, dir, bindir
       source &lt;(grep myservice /opt/mysoftware/config.conf | grep -oP '.*(?= #)')
       if [ -f $cfgfile ]
       then
           echo "Starting myservice"
           /usr/bin/screen -U -d -m $bindir/myscript.sh $cfgfile
       else
           echo "myservice could not start because the file $cfgfile is missing"
       fi
   ;;
 stop)
   # kill processes
   echo "Stopping myservice"
   screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
   ;;
 restart)
   # kill and restart processes
   /etc/init.d/myservice stop
   /etc/init.d/myservice start
   ;;
 *)
   echo "Usage: /etc/init.d/myservice {start|stop|restart}"
   exit 1
   ;;
esac

exit 0

文件 config.conf 是一個變數聲明列表,帶有簡短的描述和使用它們的腳本的名稱。我使用 grep 過濾器僅獲取給定腳本所需的變數。

它看起來像這樣:

var1=value # path to tmp folder   myservice
var2=value # log file name        myservice script1.sh script2.sh
var3=value # prefix for log file  script1.sh script2.sh

注意:在我將其轉換為開始使用配置文件而不是硬編碼值之前,該服務執行良好。

謝謝你。

Bash、ksh93、zsh 和其他最近的 shell 支持程序替換(&lt;(command)語法),但它是非標準擴展。Dash(/bin/sh在 Ubuntu 系統上)不支持它,而 bash 在呼叫時也不支持/bin/sh

如果您有 bash 可用,請將腳本的第一行更改為,例如#!/bin/bash.

[在可掛載文件系統上的目錄中具有 bash 的系統上,例如/usr/local/bin在某些系統上,您可能需要在啟動服務之前確保文件系統可用。]

引用自:https://unix.stackexchange.com/questions/178018