“bash -x”(디버그 모드)를 소스 스크립트로 되풀이하려면 어떻게해야합니까?


10

Linux의 로그인 초기화에서 bash가 수행하는 작업을 디버깅하려고합니다. "bash -x"는 bash가 수행중인 작업을 출력하지만 "set -x"와 같은 소스 파일의 명령은 인쇄하지 않는다는 것을 읽었습니다. 호출하기 전에 초기화가 실행되기 때문에 "set -x"를 사용할 수 없습니다. "bash -x"는 OS X에서 잘 반복되는 것처럼 보이지만 bash 버전 때문일 수 있습니다.

리눅스 : 3.2.25

OS X : 3.2.48

다음은 Linux에서 되풀이되지 않는 동작의 일부입니다.

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

/etc/profile.d/vim.sh의 소스가 어떻게 설정되어 있지만 명령은 인쇄되지 않습니다. 업그레이드하지 않고 해결 방법이 있습니까? 버전 차이로 인해 발생합니까?

답변:


1

set -x루트 파일 (다른 모든 파일이 필요한 파일)의 어딘가에 작동해야합니다. 또는 [[ !-z "$DEBUG" ]] && set -x각 파일 과 같은 것을 소개 하고로 전화하십시오 DEBUG=1 script.sh.


루트 파일은 어디에 있습니까? 플랫폼 독립적입니까?
Kelvin

"루트 파일"이란 단순히 쉘에서 호출하고 다른 파일을 가져 오는 파일을 의미합니다. 내 예에서 루트 파일은 script.sh
mkaito

1
그러나 bash 로그인 초기화는 스크립트가 실행되기 전에 발생합니다. 스크립트에서 "set -x"를 실행하기에는 너무 늦습니다. 직접 해보십시오- "bash -l -x script.sh"를 실행하십시오. 스크립트 명령이 실행되기 전에 일어나는 일들을 볼 수 있습니다.
Kelvin

지구상에서 왜 스크립트를 사용 bash -l하시겠습니까? 이는 대화식 쉘을위한 것입니다. 스크립트는 대화식 쉘이 아닙니다.
mkaito

3
좀 더 열린 마음을 가지십시오-분명히 bash 제작자는 그것이 유용 할 것이라고 생각했습니다. 나는 적어도 2 가지 용도를 본다 : 1) 당신 ssh user@host 'bash -l -c command'은 적절한 env 가로 드되도록 달리기를 원한다 . 2) 당신은 sysadmin이고 스크립트가 실행 되기 전에 init 스크립트가 무엇을 하고 있는지 문제해결 하려고 합니다. 때로는 환경 변수가 설정되는 위치를 알고 싶을 때가 있습니다. bash -l -x
Kelvin

0

스크립트를 소싱하고 실행하지 않기 때문에 기본 스크립트의 첫 번째 명령은 "set -x"여야합니다.

이제 모든 소스 스크립트가 디버그에서 더 실행됩니다. 스크립트를 소스 할 때 현재 쉘에서 실행되므로 -x를 한 번 설정하면 모든 소스 스크립트에 적합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.