web-dev-qa-db-ja.com

PIPESTATUS、tee、/ bin / shを一緒にどのように使用しますか?

走ると

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問題、お願いしますか?

8
Yasser Zamani

shを使用しないことで解決します。

特にPIPESTATUS変数、および一般に${var[idx]}array構文は、Bashシェルに固有の機能です。それらはPOSIX shには存在せず、do配列を持つシェルでさえ異なる構文を使用する可能性があります。

一部のLinuxディストリビューションは/bin/shをBashにシンボリックリンクしていることがあります。ただし、他のディストリビューションでは、Debian Almquist Shellにシンボリックリンクしていますdash。どちらもPOSIX shスクリプトと互換性がありますが、${PIPESTATUS[…]}構文を受け入れるのはBashだけです。

したがって、使用する場合は、代わりにbash -c "…"を実行してください。

8
user1686

'/ 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
6
rzr

また、 '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から呼び出されました

1
atmchem