我正在使用一组脚本,其函数被视为只读。这些函数不仅仅是一个命令列表,例如,可以有循环和更改目录,甚至可以调用其他函数:
func() {
cd folder/
run command1
mkdir folder2/ ; cd folder2/
run command2
}
有一会儿,假装我可以更改脚本,向您展示我想要的内容,可能看起来像这样:
func() {
cd folder/
string[0]="command1" ; run command1 |& tee out0.log ; result[0]="$?" ; finished_command_number 0
mkdir folder2/ ; cd folder2/
string[1]="command2" ; run command2 |& tee out1.log ; result[1]="$?" ; finished_command_number 1
}
因此,对于可以通过管道传输但不能用于cd
循环的命令,我想存储一个字符串,存储标准输出(stderr),存储退出代码,然后运行另一个命令。但是,我无法添加它,它必须在我的脚本中完成,该脚本使用 func() 调用脚本。
为了仅获得 post 命令调用功能,我尝试复制该函数并使用 a 从我的脚本中运行它trap foo debug
,但这似乎并没有传播到函数中。我不认为逐行复制会起作用,因为cd
andloops
不能真正被隔离,因为它们是控制语句而不是 subshell 命令。
如果字符串可以只是命令本身的函数,那仍然很有用。
输出可以通过随机标记的行进行过滤。我应该进一步测试它以查看它与多个进程的工作情况如何,但它似乎与短期命令一起工作得很好。请注意退出代码滞后一个命令,因为显然首先调用了调试。
===
如果我正确阅读了您的问题,那么您正在寻找一种方法:
这可以相当简单地完成:
在子 shell 中运行该函数将允许它执行与更改工作目录相关的任何操作,并正常输出到 stdout 和 stderr。当 subshell 退出时,脚本的工作目录不变,所有的 stdout 和 stderr 输出都被捕获并重定向到您的日志文件中。
添加一个(全局或其他)数组来捕获命令的退出代码是微不足道的: