予期しない表示'('の近くに構文エラーがあります.

予期しない表示'('の近くに構文エラーがあります.

CentOSのSSH端末で次のコードを使用すると正常に動作します。

paste <(printf "%s\n" "TOP")

ただし、同じコード行をシェルスクリプト(test.sh)に入れて端末でシェルスクリプトを実行すると、次のようにエラーが発生します。

./test.sh: line 30: syntax error near unexpected token ('   
./test.sh: line 30:     paste <(printf "%s\n" "TOP")

この問題をどのように解決できますか?

ベストアンサー1

プロセスの置き換えPOSIXが指定されていないため、すべてのPOSIXシェルがそれをサポートしているわけではなく、、、などの一部のbashシェルのみをサポートしzshています。ksh88ksh93

CentOSシステムでは、/bin/shyesで呼び出す/bin/bashとposixモード(bashshbashBash起動ファイル - shという名前で呼び出されます)。 5.1より前のbashバージョンではプロセスの交換posix モードで呼び出すと、サポートが無効になり、構文エラーが発生します。

スクリプトを直接呼び出すとスクリプトが機能しますbashbash test.shそれ以外の場合は、bashposixモードに入った可能性があります。bashパラメータを使用して起動したり、起動時に変数を設定したりすると、これが--posix発生する可能性があります。POSIXLY_CORRECTbash

$ bash --posix test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")'

$ POSIXLY_CORRECT=1 bash test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")

またはオプションbashで作成されました--enable-strict-posix-default

ここでは、プロセスの置き換えは必要なく、標準のシェルパイプを使用できます。

printf "%s\n" "TOP" | paste -

-pastestdinからデータを読み取るように指示する標準的な方法。標準ではありませんが、一部のpaste実装では省略できます。

これは、複数のコマンドの出力を貼り付けるときに便利です。たとえば、次のようになります。

paste <(cmd1) <(cmd2)

サポートされているシステムでは、/dev/fd/n次のことができますsh

{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0

(これが<(...)内部で行うことです。)

おすすめ記事