你如何一起使用 PIPESTATUS、tee 和 /bin/sh?

Yas*_*ani 8 linux bash pipe exit-code

当我跑

curl | tee test.txt; echo ${PIPESTATUS[0]}
Run Code Online (Sandbox Code Playgroud)

我正确地看到

curl:尝试“curl --help”或“curl --manual”以获取更多信息

2

但是当我尝试使用“/bin/sh”运行完全相同的命令时:

sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"
Run Code Online (Sandbox Code Playgroud)

我得到

curl:尝试“curl --help”或“curl --manual”以获取更多信息

sh: 1: 替换错误

Bad substitution请问我们如何解决问题?

use*_*686 9

你通过不使用来解决它sh

PIPESTATUS可变具体地,并且在${var[idx]} 阵列中一般语法,是特征特定于击壳。他们不存在POSIX SH,甚至炮弹有阵列可能会使用不同的语法。

碰巧一些 Linux 发行版将它们符号链接/bin/sh到 Bash。然而,其他发行版将其符号链接到dash,Debian Almquist Shell。两者都与 POSIX sh脚本兼容,但只有 Bash 接受${PIPESTATUS[…]}语法。

因此,如果您想使用它,请bash -c "…"改为运行。


rzr*_*rzr 7

'/bin/sh' 或 busybox 的解决方法

status=0
eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null`
echo "# status=${status}"
Run Code Online (Sandbox Code Playgroud)

痕迹 :

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
Run Code Online (Sandbox Code Playgroud)