5

Centos 6 マシンでは、次のように動作します。

bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'

これはしません:

sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'

私は得る:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'

grep と tail を気にしないでください。問題は、プロセス置換のものです。<(...)

ここでshが違うことを誰か教えてもらえますか?

[編集]

答えてくれてありがとう!

この問題は、展開にcapistranoを使用しているときに発生しました。デフォルトではshが使用されますが、現在はbashに変更されています。通常のパイピングができなかったのは、 を使用している場合tail -F | grep -q --line-buffered、マッチ直後に grep が終了しないためです。のようなファイルをもう 1 つ編集する必要がありecho "" >> catalina.out、これは私の状況では受け入れられませんでした。

4

3 に答える 3

6

この構文<(...)は BASH でのみサポートされています。

どの POSIX シェルでも、次のアプローチを使用します。

sh -c 'tail -n 1000 -F catalina.out | if grep -qP --line-buffered ".+" ; then ...'

つまり、stdin リダイレクトをifパイプの前に移動します。はifstdin を に渡しgrepます。

if tail ...| grepパイプがプロセスを分離しているため、それが/ifであることを確認できないため、機能しません。thenfi

于 2013-09-05T08:37:26.400 に答える
6

<(...)プロセス置換 ( ) は POSIX で指定されていないことに注意してください。したがってbash、POSIX モードで実行していた場合は、次のように呼び出すshか、次のように言います。

set -o posix

次に、エラーを観察します。

bashマニュアルから:

コマンドライン オプションで Bash を起動する--posixか、Bash の実行中に '<code>set -o posix' を実行すると、Bash のデフォルトが異なる領域で POSIX によって指定されたものと一致するように動作が変更されるため、Bash は POSIX 標準により近く準拠します。

...

プロセス代替はできません。

于 2013-09-05T08:53:54.770 に答える
4

また、 Bash が sh という名前で呼び出された場合、POSIX 標準にも準拠しながら、sh の履歴バージョンの起動時の動作を可能な限り模倣しようとすることにも注意してください。

sh が実際に bash へのリンクである場合、これが原因です。

実行sh --version; sh -c ': <(echo a)'すると、十分な情報が得られるはずです。

于 2013-09-05T08:53:21.740 に答える