予期しないトークン `( '付近の構文エラー


15

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")

この問題を修正するにはどうすればよいですか?


どのくらい正確に実行していますか?何 '#!' 行(ある場合)はスクリプトを開始しますか?その構文をサポートしていないシェルインタープリターを呼び出しているようです(例:のdash代わりにbash)。
スチールドライバー

私が持っている#!/bin/sh一番上に。として実行しましたbash test.shが、それも機能しませんでした。
NecNecco

bashPOSIXモードでは、その構文をサポートしていません(--posixまたはで呼び出された場合/bin/sh)。を使用し#!/bin/bashます。
ヨルダン14

@NecNecco:POSIXLY_CORRECT起動時に変数が設定されていますbashか?
cuonglm 14

@jordanmを#!/bin/bash最上位に切り替えると、問題が修正されました。
NecNecco 14

回答:


23

プロセス置換は POSIXによって指定されていない、そうではないすべてのPOSIXシェルは、のようないくつかだけのシェルそれをサポートしbashzshksh88ksh93サポートを。

ではCentosシステム、/bin/shへのシンボリックリンクです/bin/bash。ときはbash名前で呼び出されshbashPOSIXモード(入るbashの起動ファイルを-名前SHで呼び出されます)。posixモードでは、process substitutionは、サポートされていません。構文エラーが発生します。

bash直接呼び出すと、スクリプトが機能するはずですbash test.sh。そうでない場合、bashposixモードに入った可能性があります。これは、開始時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 -

-pastestdinからデータを読み取るよう指示する標準的な方法です。一部の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")'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.