Shell-Script
如何在 case 語句中使用程序替換而不會出現語法錯誤?
我在 /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 <(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 支持程序替換(
<(command)
語法),但它是非標準擴展。Dash(/bin/sh
在 Ubuntu 系統上)不支持它,而 bash 在呼叫時也不支持/bin/sh
。如果您有 bash 可用,請將腳本的第一行更改為,例如
#!/bin/bash
.[在可掛載文件系統上的目錄中具有 bash 的系統上,例如
/usr/local/bin
在某些系統上,您可能需要在啟動服務之前確保文件系統可用。]