答案1
听起来您希望有一个 shell 语法扫描器和解析器来输出找到的标记以及执行实际命令过程中所采取的操作。
我不知道有任何 shell 会执行此操作,因为它会极大地减慢处理速度,并为每个稍微复杂的命令生成大量输出。
使用,如果您自己使用定义的宏bash
编译 shellDEBUG
和itrace()
如果您在 shell 源代码1中启用对该函数的所有注释掉的调用,那么您可以获得一些您想要看到的内容:
bash-4.4$ if [[ "$BASHPID" = 10 ]] && [[ "$USER" = myself ]]; then echo hello me; fi
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $BASHPID"
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $USER"
TRACE: pid 22914: param_expand: `$BASHPID' pflags = 0
在这里,您可以看到解析器输出一些有关查找打开和关闭双引号以及 shell 变量的调试语句。随后,另一个处理步骤通知我们执行了 的参数扩展$BASHPID
,但远未列出所有步骤。
这种类型的调试输出bash
对于实际参与编写和修改 shell 源代码的人来说更有用,并且绝对不是为了理解 shell 解析和解释其输入的方式。
为了更熟悉 shell 的语法和语法是如何工作的,我建议从shell 语法的 POSIX 定义(这相当复杂,对于无法阅读的人来说或多或少没有意义EBNF)。
1除了其中lib/glob/glob.c
有一个语法错误之外。
答案2
set -x
适用于 bash shell 脚本,不适用于二进制文件。
如果您想跟踪二进制执行,您应该考虑使用调试器(例如gdb
)