在尝试了解 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
如果PS1
and/orPROMPT_COMMAND
包含命令,就会发生这种情况。
答案2
通常发生在PROMPT_COMAND
或时PS1
。通常的解决方法是:
set -x; ls; set +x
即:用跟踪命令包围该命令。
答案3
我在 Ask Different 中找到了答案:
我可以根据那里的建议在需要时将其关闭,并在完成后将其重新打开。似乎有效。