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에서 답을 찾았습니다.
거기에 있는 제안을 사용하여 필요할 때 끄고 작업이 끝나면 다시 켤 수 있습니다. 작동하는 것 같습니다.