特定のbash機能が実行されますが、エクスポートに失敗します(「エクスポート」も失敗しません)。

特定のbash機能が実行されますが、エクスポートに失敗します(「エクスポート」も失敗しません)。

私はこれをテストしました:

~$ 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異なると推測します。以下を実行してこれを確認できます。$PATHbash -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

関連情報