长话短说:有没有办法打印 bash shell 脚本每个步骤的输入和输出,包括管道命令之间的步骤?
希望这是相关的:我不久前写了一个脚本,现在想编辑它,但我不再明白它是如何工作的。我将使用这个脚本举个例子:
#! /usr/bin/bash
set -ev
TREE_IGNORE_PATTERN='node_modules|package-lock.json|.gitignore|.git|dist'
echo '### Project Structure'
echo '```'
tree --noreport -F -a -I $TREE_IGNORE_PATTERN | tr -d '*'
echo '```'
echo ""
tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'
正如你所看到的,我set -v
在顶部。这很有帮助,因为它告诉我实际执行的内容,但不足以了解管道的每个步骤如何工作。真正有帮助的是逐步查看输入转换。由于这信息量很大,我通常会手动进行:
- 我忘记怎么
tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'
用了,所以我就复制一下。 - 我将其粘贴到我的命令行中。
- 因为它取决于一个名为 的变量
$TREE_IGNORE_PATTERN
:- 我复制该变量的扩展值。
- 我用扩展值替换命令行上的该变量。
- 现在命令如下所示:
tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | ...
。
- 我enter按命令行运行步骤3.3。这是为了将该命令保存在我的历史记录中,以便我可以通过按 返回该命令up。
- 我按up.
- 我通过删除所有管道命令来编辑命令行,留下
tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist'
. - 我运行它来了解输出。
- 我按up.
- 我通过删除所有管道命令来编辑命令行但是 1,留下我
tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | awk '$0 !~ /\/$/ && $0 !~ /^\.$/'
。 - 我运行它来了解输出。
- 我重复直到我运行步骤3.3再次在命令行上。现在我可以看到输入转换的每一步。
这是大量的手工工作。是否有一种自动方式来查看 bash shell 脚本中每个管道命令的输入和输出?
如果答案是“不,但zsh
可以”,我会接受这个答案(但前提是不能bash
)。我也接受,“不,但是如果你写/评论你的代码就像这,当你重新访问它时会更容易理解,”但同样,只有当bash
并且zsh
没有办法自动执行此操作时。
答案1
如果您希望它们不被混淆,并且一次只需要调试一个管道,您可以使用tee
管道将每个输出的副本传输到一个文件。在你的情况下:
tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'
会成为:
tree --noreport -nFif -I $TREE_IGNORE_PATTERN | tee out1.log | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tee out2.log | tr -d '*' | tee out3.log | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'