私のシステムに-xを設定するとどうなりましたか?

私のシステムに-xを設定するとどうなりましたか?

bash シェル拡張と引数渡しへの影響を理解しようとする間に、grep誰かがset -xシェルでトレースオプションを設定し、シェルが私のコマンドをどのように解析するかを見てほしいと提案しました。私のリモート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
~ $

トレースをオンにし、シェルが私のコマンドを処理する方法を示す+記号を持つ追加の出力行を取得しました。 (コマンドがより複雑でより多くの処理が必要な場合は、より多くの出力ラインが得られることを知っています。)その後、トレースをオフにして、これまでは正常な出力に戻ります。しかし、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使用するときにもう少し便利な機能があったらと思います。これにより、シェルがコマンドを解析する方法を理解することが不可能になりました。ありがとうございます。

答え1

これはPS1、および/またはコマンドが含まれている場合に発生します。PROMPT_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

そこにある提案を使用して、必要に応じてオフにし、作業が終わったら再びオンにすることができます。うまくいくようです。

関連情報