在shell脚本中,如何打印管道链每一步的输入?

在shell脚本中,如何打印管道链每一步的输入?

长话短说:有没有办法打印 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在顶部。这很有帮助,因为它告诉我实际执行的内容,但不足以了解管道的每个步骤如何工作。真正有帮助的是逐步查看输入转换。由于这信息量很大,我通常会手动进行:

  1. 我忘记怎么tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'用了,所以我就复制一下。
  2. 我将其粘贴到我的命令行中。
  3. 因为它取决于一个名为 的变量$TREE_IGNORE_PATTERN
    1. 我复制该变量的扩展值。
    2. 我用扩展值替换命令行上的该变量。
    3. 现在命令如下所示:tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | ...
  4. enter按命令行运行步骤3.3。这是为了将该命令保存在我的历史记录中,以便我可以通过按 返回该命令up
  5. 我按up.
  6. 我通过删除所有管道命令来编辑命令行,留下tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist'.
  7. 我运行它来了解输出。
  8. 我按up.
  9. 我通过删除所有管道命令来编辑命令行但是 1,留下我tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | awk '$0 !~ /\/$/ && $0 !~ /^\.$/'
  10. 我运行它来了解输出。
  11. 我重复直到我运行步骤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 "" }'

相关内容