構文エラーを起こさずに case ステートメント内でプロセス置換を使用するにはどうすればよいでしょうか?

構文エラーを起こさずに case ステートメント内でプロセス置換を使用するにはどうすればよいでしょうか?

/etc/init.d/myfileにサービスとしてロードされたスクリプトがあります

サービスを開始しようとするとエラーが発生します

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

問題は、ソース コマンドのプロセス置換 <( にあるようです。メイン構成ファイルから変数を抽出するために他のスクリプトでは問題なく使用していますが、case ステートメント内では、どのように動作させるかわかりません。

myservice には以下が含まれます:

#!/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

注: ハードコードされた値の代わりに構成ファイルを使用するように変換する前は、サービスは正常に動作していました。

ありがとう。

答え1

Bash、ksh93、zsh、およびその他の最近のシェルはプロセス置換 (構文<(command)) をサポートしていますが、これは非標準の拡張機能です。Dash ( /bin/shUbuntu システム上) はこれをサポートしておらず、 as として呼び出された bashもこれをサポート/bin/shしていません。

bash が使用できる場合は、スクリプトの最初の行を、たとえば次のように変更します#!/bin/bash

[一部のシステムのように、マウント可能なファイルシステム上のディレクトリに bash があるシステムでは/usr/local/bin、サービスを開始する前にファイルシステムが使用可能であることを確認する必要がある場合があります。]

答え2

プロセス置換バシズム、しかしあなたのシェバンラインです#!/bin/sh。Bash/bin/shまたはプロセス置換をサポートする他のシェルでない限り、その構文は実際にはサポートされていません。@マーク・プロトニック

関連情報