走ると
curl | tee test.txt; echo ${PIPESTATUS[0]}
正しく見えます
curl:詳細については、「curl--help」または「curl--manual」を試してください。
2
しかし、「/ bin/sh」を使用してまったく同じコマンドを実行しようとすると、次のようになります。
sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"
私は得る
curl:詳細については、「curl--help」または「curl--manual」を試してください。
sh:1:不適切な置換
どうすれば解決できますかBad substitution
問題、お願いしますか?
sh
を使用しないことで解決します。
特にPIPESTATUS
変数、および一般に${var[idx]}
array構文は、Bashシェルに固有の機能です。それらはPOSIX shには存在せず、do配列を持つシェルでさえ異なる構文を使用する可能性があります。
一部のLinuxディストリビューションは/bin/sh
をBashにシンボリックリンクしていることがあります。ただし、他のディストリビューションでは、Debian Almquist Shellにシンボリックリンクしていますdash。どちらもPOSIX shスクリプトと互換性がありますが、${PIPESTATUS[…]}
構文を受け入れるのはBashだけです。
したがって、使用する場合は、代わりにbash -c "…"
を実行してください。
'/ bin/sh'またはbusyboxの回避策
status=0
eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null`
echo "# status=${status}"
痕跡 :
busybox sh ~/bin/test.sh
+ status=0
+ ls /dontexists
+ tee /dev/null
ls: /dontexists: No such file or directory
+ echo status=1
+ eval status=1
+ status=1
+ echo # status=1
# status=1
また、 'bash -c'は、tcshから呼び出されたときに問題があるようです。
bash -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"
PIPESTATUS:未定義の変数。
これはtcshから私のために働きます:
bash -c 'curl | tee test.txt; echo ${PIPESTATUS[0]}'
curl:詳細については、「curl--help」または「curl--manual」を試してください。
2
GNU bash、バージョン4.2.25(1)-リリース(x86_64-pc-linux-gnu)
tcsh6.17.06から呼び出されました