私は変数aおよびbへのコマンドの出力を読み取るスクリプトを作成します。これはスクリプトです
#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b"
次のように構文エラーが発生します:
line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)"
しかし、コンソールで同じコマンドを入力すると、問題なく機能します。
app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED
これに関するヘルプは本当にありがたいです。
コメント
回答
sh
(ほとんどの(Debian派生)システムではdash
にリンクされています)は、プロセス置換を許可しません /em>。bash script.sh
で呼び出してみてください。./script.shによる同じ呼び出しはsha-bang
で実行されます。これは /bin/bash
。
コメント
- @MichaelDurrantああ、あなたの変更は私が言ったことの反対を意味するようになりました。
- @muru変更を受け入れることができません' t o
bash
。正確にはdash
を意味します。file $(which sh)
出力/bin/sh: symbolic link to 'dash'
- Costas、それは'です意味した。 Michael Durrantが編集を変更して、
dash
をbash
に置き換えました。修正していただきありがとうございます。 - コマンド置換(
$(echo foo)
)ではなく、プロセス置換(<( echo foo )
)を意味します(これははPOSIX仕様の一部です。 - @chepnerその通りです。コメントありがとうございます。修復されました。
回答
スクリプトをshfile.shとして呼び出そうとしましたが、エラーが発生していました。 。しかし、。/ file.shおよびbashfile.shと同じスクリプトを呼び出すと、それは機能しており、目的の結果が得られます。
回答
さらに、スクリプトの先頭に次の行を追加するだけです。
#!/bin/bash
ターミナル/コンソールにスクリプトをbashスクリプトとして実行するように指示し、プロセス置換よりも「<( cmd )
」が正常に機能します。
コメント
- OP 'のスクリプトにはすでにそのシバンがありますが、OPは実行されていました。
file.sh
または./file.sh
ではなくsh file.sh
として使用します(彼ら自身の答え)
$ ./script.sh
sh
'コマンド置換を許可しないでください。bash script.sh
で呼び出してみてください。./script.sh
による同じ呼び出しは、スクリプトの/ bin / ** bash **であるsha-bang
で実行されます。