我的系统上的 set -x 怎么了?

我的系统上的 set -x 怎么了?

在尝试了解 bash shell 扩展及其对将参数传递给 的影响时grep,有人建议我set -x在 shell 上设置跟踪选项,并查看 shell 如何解析我的命令。在我的远程 BSD 帐户上,这似乎按预期工作:

~ $ ls
a.sh      b.sh      my.sh     small.txt temp
~ $ set -x
~ $ ls
+ ls
a.sh      b.sh      my.sh     small.txt temp
~ $ set +x
+ set +x
~ $ ls
a.sh      b.sh      my.sh     small.txt temp
~ $

我打开跟踪,得到一行额外的输出,其中带有 + 号,表示 shell 如何处理我的命令。 (我知道,如果命令更复杂并且需要更多处理,我会得到更多行输出。)然后我关闭跟踪,它会返回到正常输出到目前为止,一切都很好。但是,当我在 Mojave 的 Mac 上运行 bash 的本地终端上执行完全相同的命令时,我得到了完全不同的输出:

~ $ ls
#hello#         Downloads/      Public/         isus/
#two#           Library/        Sync/           notes.txt
Applications/       Movies/         bin/            notes.txt~
Desktop/        Music/          derby.log       sync-startup-log.txt
Documents/      Pictures/       hello~
~ $ set -x
++ update_terminal_cwd
++ local url_path=
++ local i ch hexch LC_CTYPE=C LC_ALL=
++ (( i = 0 ))
++ (( i < 12 ))
++ ch=/
++ [[ / =~ [/._~A-Za-z0-9-] ]]
++ url_path+=/
++ (( ++i ))
++ (( i < 12 ))
++ ch=U
++ [[ U =~ [/._~A-Za-z0-9-] ]]
++ url_path+=U
++ (( ++i ))
++ (( i < 12 ))
++ ch=s
++ [[ s =~ [/._~A-Za-z0-9-] ]]
++ url_path+=s
++ (( ++i ))
++ (( i < 12 ))
++ ch=e
++ [[ e =~ [/._~A-Za-z0-9-] ]]
++ url_path+=e
++ (( ++i ))
++ (( i < 12 ))
++ ch=r
++ [[ r =~ [/._~A-Za-z0-9-] ]]
++ url_path+=r
++ (( ++i ))
++ (( i < 12 ))
++ ch=s
++ [[ s =~ [/._~A-Za-z0-9-] ]]
++ url_path+=s
++ (( ++i ))
++ (( i < 12 ))
++ ch=/
++ [[ / =~ [/._~A-Za-z0-9-] ]]
++ url_path+=/
++ (( ++i ))
++ (( i < 12 ))
++ ch=a
++ [[ a =~ [/._~A-Za-z0-9-] ]]
++ url_path+=a
++ (( ++i ))
++ (( i < 12 ))
++ ch=d
++ [[ d =~ [/._~A-Za-z0-9-] ]]
++ url_path+=d
++ (( ++i ))
++ (( i < 12 ))
++ ch=m
++ [[ m =~ [/._~A-Za-z0-9-] ]]
++ url_path+=m
++ (( ++i ))
++ (( i < 12 ))
++ ch=i
++ [[ i =~ [/._~A-Za-z0-9-] ]]
++ url_path+=i
++ (( ++i ))
++ (( i < 12 ))
++ ch=n
++ [[ n =~ [/._~A-Za-z0-9-] ]]
++ url_path+=n
++ (( ++i ))
++ (( i < 12 ))
++ printf '\e]7;%s\a' file://admins-iMac.local/Users/admin
~ $ ls
+ ls -F
#hello#         Downloads/      Public/         isus/
#two#           Library/        Sync/           notes.txt
Applications/       Movies/         bin/            notes.txt~
Desktop/        Music/          derby.log       sync-startup-log.txt
Documents/      Pictures/       hello~
++ update_terminal_cwd
++ local url_path=
++ local i ch hexch LC_CTYPE=C LC_ALL=
++ (( i = 0 ))
++ (( i < 12 ))
++ ch=/
++ [[ / =~ [/._~A-Za-z0-9-] ]]
++ url_path+=/
++ (( ++i ))
++ (( i < 12 ))
++ ch=U
++ [[ U =~ [/._~A-Za-z0-9-] ]]
++ url_path+=U
++ (( ++i ))
++ (( i < 12 ))
++ ch=s
++ [[ s =~ [/._~A-Za-z0-9-] ]]
++ url_path+=s
++ (( ++i ))
++ (( i < 12 ))
++ ch=e
++ [[ e =~ [/._~A-Za-z0-9-] ]]
++ url_path+=e
++ (( ++i ))
++ (( i < 12 ))
++ ch=r
++ [[ r =~ [/._~A-Za-z0-9-] ]]
++ url_path+=r
++ (( ++i ))
++ (( i < 12 ))
++ ch=s
++ [[ s =~ [/._~A-Za-z0-9-] ]]
++ url_path+=s
++ (( ++i ))
++ (( i < 12 ))
++ ch=/
++ [[ / =~ [/._~A-Za-z0-9-] ]]
++ url_path+=/
++ (( ++i ))
++ (( i < 12 ))
++ ch=a
++ [[ a =~ [/._~A-Za-z0-9-] ]]
++ url_path+=a
++ (( ++i ))
++ (( i < 12 ))
++ ch=d
++ [[ d =~ [/._~A-Za-z0-9-] ]]
++ url_path+=d
++ (( ++i ))
++ (( i < 12 ))
++ ch=m
++ [[ m =~ [/._~A-Za-z0-9-] ]]
++ url_path+=m
++ (( ++i ))
++ (( i < 12 ))
++ ch=i
++ [[ i =~ [/._~A-Za-z0-9-] ]]
++ url_path+=i
++ (( ++i ))
++ (( i < 12 ))
++ ch=n
++ [[ n =~ [/._~A-Za-z0-9-] ]]
++ url_path+=n
++ (( ++i ))
++ (( i < 12 ))
++ printf '\e]7;%s\a' file://admins-iMac.local/Users/admin
~ $ set +x
+ set +x
~ $ ls
#hello#         Downloads/      Public/         isus/
#two#           Library/        Sync/           notes.txt
Applications/       Movies/         bin/            notes.txt~
Desktop/        Music/          derby.log       sync-startup-log.txt
Documents/      Pictures/       hello~
~ $ 

知道这是怎么回事吗?这是正常的吗?就好像系统在我执行的每个命令之后添加这些命令/脚本行。这与在 Mac 上使用终端有什么关系吗?或者我的系统上是否有一些我无法追踪的奇怪的 bash 配置?

有办法关掉这个吗?我希望set -x在使用时能有一个更有用的功能。这使得尝试理解 shell 如何解析命令变得不可能。谢谢。

答案1

如果PS1and/orPROMPT_COMMAND包含命令,就会发生这种情况。

答案2

通常发生在PROMPT_COMAND或时PS1。通常的解决方法是:

set -x;   ls;   set +x

即:用跟踪命令包围该命令。

答案3

我在 Ask Different 中找到了答案:

https://apple.stackexchange.com/questions/238736/why-does-set-x-cause-the-terminal-to-dump-garbage/376​​906#376906

我可以根据那里的建议在需要时将其关闭,并在完成后将其重新打开。似乎有效。

相关内容