gpt4 book ai didi

Bash set -x echo 重定向以及命令

转载 作者:行者123 更新时间:2023-11-29 08:50:20 25 4
gpt4 key购买 nike

我正在编写一个 Bash 脚本,我希望所有命令在它们出现时都被回显。我知道我需要使用 set -xset +x 分别关闭和打开此行为 ( SOF post here )。但是,它并没有回显所有内容,即 I/O 重定向。

例如,假设我有这个非常简单的 Bash 脚本:

set -x
./command1 > output1
./command2 arg1 arg2 > output2

这将是输出

+ ./command1
+ ./command2 arg1 arg2

Bash 没有将我的标准输出重定向到 output1output2。为什么是这样?我怎样才能实现这种行为?也许我必须在脚本中设置一个 shopt 选项?

注意:我还注意到管道不会按预期打印。例如,如果我要使用此命令:

set -x
./command3 | tee output3

我会得到这个输出:

+ tee output3
+ ./command3

如何使命令按照它们的编写方式准确回显,而不是让脚本对管道重新排序?

最佳答案

set -x 和 DEBUG 陷阱都不会在使用某些结构时提供完整信息。

例子是:

ex1.sh

for i in a b c
do
echo $i # Where does the output go?
done > outfile # Here!

ex2.sh

c="this"
case "$c" in
this) echo sure ;; # Where does the output go?
that) echo okay ;;
esac > choice # Here!

ex3.sh

what="up"
while [ "$what" = "up" ]
do
echo "Going down!" # Where does the output go?
what="down"
echo "Newton rulezzz!" > thelaw
done > trying # Here!

还有很多类似的,更不用说各种嵌套变体了。我不知道有什么简单的方法来处理这些问题,除了进入完整的 Bash 脚本解析领域,这是一个雷区...

编辑:如果不需要特定于 Bash 的功能,并且可以向后兼容 Bourne shell,Korn shell(ksh,使用版本 93u+ 2012-08-01 测试)在显示重定向信息方面做得更好:

$ ksh -x ex1.sh 
+ 1> outfile
+ echo a
+ echo b
+ echo c

$ ksh -x ex2.sh
+ c=this
+ 1> choice
+ echo sure

$ ksh -x ex3.sh
+ what=up
+ 1> trying
+ [ up '=' up ]
+ echo 'Going down!'
+ what=down
+ echo 'Newton rulezzz!'
+ 1> thelaw
+ [ down '=' up ]

关于Bash set -x echo 重定向以及命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15366570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com