私はこれをテストしました:
~$ test() { echo foo |sed -r s/.*(.)/\\1/g; }
~$ test
o
今まではそんなに良くなった。しかし:
~$ export -f test
~$ bash -c ''
bash: test: line 0: syntax error near unexpected token `('
bash: test: line 0: `test () { echo foo | sed -r s/.*(.)/\\1/g'
bash: error importing function definition for `test'
sed
引用符を使用すると問題が解決することがわかります。ただし、実行中の機能をエクスポートしないbashは衝撃的であり、説明、規則、および例が必要です。
私はbashが独自の参照を処理したいので、これは単にバグかもしれないと思います。
答え1
bash
お使いのシステムには2つのバージョンがあると思われますbash -c ''
。このコードまたはあなたのコードは、問題の生成時に変更されました。
私がそう思う理由は、あなたのコードが私のシステムで動作しないことです。
$ test() { echo foo |sed -r s/.*(.)/\\1/g; }
bash: syntax error near unexpected token `('
問題は、式の周りに引用符がないsed
ため、bashはこれをシェル式として解釈しようとしていることです。私はこの動作がbashバージョン間で変更され、ログインシェルバージョンが呼び出すバージョンとはbash
異なると推測します。以下を実行してこれを確認できます。$PATH
bash -c ''
$ echo $SHELL
$ which bash
別の考えられる原因は、bashの式の評価動作を変更するいくつかのシェルオプションを設定したが、これらのオプションが使用されない場合ですbash -c ''
。
この問題を解決する方法は、式を正しく引用するとsed
正常に機能します。
$ test() { echo foo | sed 's/.*\(.\)/\1/g'; }
$ export -f test
$ bash -c 'test'
o
sed
(注:私のバージョンでは有効なコマンドではないため、コマンドを少し調整する必要がありました。sed
)