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
ています。ksh88
ksh93
CentOSシステムでは、/bin/sh
yesで呼び出す/bin/bash
とposixモード(bash
sh
bash
Bash起動ファイル - shという名前で呼び出されます)。 5.1より前のbashバージョンではプロセスの交換posix モードで呼び出すと、サポートが無効になり、構文エラーが発生します。
スクリプトを直接呼び出すとスクリプトが機能しますbash
。bash test.sh
それ以外の場合は、bash
posixモードに入った可能性があります。bash
パラメータを使用して起動したり、起動時に変数を設定したりすると、これが--posix
発生する可能性があります。POSIXLY_CORRECT
bash
$ 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 -
-
paste
stdinからデータを読み取るように指示する標準的な方法。標準ではありませんが、一部のpaste
実装では省略できます。
これは、複数のコマンドの出力を貼り付けるときに便利です。たとえば、次のようになります。
paste <(cmd1) <(cmd2)
サポートされているシステムでは、/dev/fd/n
次のことができますsh
。
{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0
(これが<(...)
内部で行うことです。)
答え2
別の解決策があります。そのコマンドを実行する代わりにbashを実行し、-cを使用してコマンドをbashに渡します。
bash -c 'paste <(printf "%s\n" "TOP")'