내 시스템에 -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

거기에 있는 제안을 사용하여 필요할 때 끄고 작업이 끝나면 다시 켤 수 있습니다. 작동하는 것 같습니다.

관련 정보