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


6

走ったとき

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問題を解決できますか。



@jww、彼らは経由で動作しsh -c "<your above link answer's scripts here>"ますか?
ヤセル・サマーニ

回答:


6

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

特にPIPESTATUS変数、そして一般的な${var[idx]} 配列構文は、Bashシェルに特有の機能です。彼らは、POSIXには存在しないSH、さらにはシェル行うの配列を持っているが異なる構文を使用する場合があります。

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

あなたがそれを使いたいのであれば、bash -c "…"代わりに実行してください。


質問のその部分を使用するためshです。ハックで、より良い答えを以下に示します。よりよい「解決策」ではありません(ただし、より良い解決策は避けることですsh
Dr Beco

5

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

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)
、tcsh 6.17.06から呼び出された


これは予想される動作です。一重引用符では変数の補間は行われません。stackoverflow.com/questions/6697753/
..
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.