2012-01-31 2 views
63

bash -x 옵션을 입력하면 모든 행이 표시됩니다. 그러나 스크립트는 normaly를 실행합니다.어떻게 bash 스크립트를 한 줄씩 실행합니까?

줄 단위로 어떻게 실행할 수 있습니까? 내가 올바른 일을하는지, 아니면 버그를 중단하고 고칠 수 있는지 알 수 있습니다. 동일한 효과가 모든 행에 read으로 표시됩니다.

+0

아마도 더 넓게 이건 정말 최고의 솔루션입니다 또한 https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee

답변

87

everyline에서 읽을 필요가 없습니다. 다음과 같은 트랩을 bash 스크립트에 추가하면 원하는 효과가 나타납니다.

#!/usr/bin/env bash 
set -x 
trap read debug 

< YOUR CODE HERE > 

작동, 그냥 bash v4.2.8 및 v3.2.25로 테스트했습니다.


개선 된 버전

스크립트 파일의 내용을 읽는 경우, 위에 나열된 작동하지 않습니다. 해결 방법은 다음 예제와 같습니다.

#!/usr/bin/env bash 
echo "Press CTRL+C to proceed." 
trap "pkill -f 'sleep 1h'" INT 
trap "set +x ; sleep 1h ; set -x" DEBUG 

< YOUR CODE HERE > 

해야 할 것입니다 스크립트가이 경우 다른 쉘에서 죽일 중지하십시오.


당신은 단순히 당신을 위해 일할 수있는 스크립트의 다음 명령에 다음 예제를 진행하기 전에 몇 초를 기다려야합니다 ALTERNATIVE1.

#!/usr/bin/env bash 
trap "set +x; sleep 5; set -x" DEBUG 

< YOUR CODE HERE > 

출력을 읽기 쉽게하려면 trap 명령에 set + x와 set -x를 추가합니다.

+1

그러면 어떻게 다음 단계로 넘어갈 수 있습니까 (다음 명령 실행)? –

+2

모든 명령에서 읽기를 트랩합니다.당신이해야 할 일은 return을 눌러 다음 명령을 얻는 것입니다. –

+0

다른 쉘을 사용하고 싶다면 ksh와 함께 작업하십시오. – ChrisGer

10

아마도 BASH Debugger이 적합 할 수 있습니다.

+1

참조하십시오. 그것은 (그리고 훨씬 더) 실행되기 전에 라인을 볼 수 있습니다. 대부분의 시스템에서는'apt-get install bashdb '로 설치할 수 있습니다. 그런 다음'bashdb your_command.sh'를 실행하고'step'을 입력 한 다음 캐리지 리턴을 누른다. – studgeek

+0

@studgeek Redhat/CentOS 등에서는 사용할 수 없으므로 "대부분의 시스템"이라고 부르지 않습니다. – Sajuuk

0

bash 스크립트가 실제로 하나씩 실행하려는 명령에서 한 묶음이라면 다음과 같이 할 수 있습니다.이 명령은 행에 해당하는 변수 LN을 증가시킬 때 각 명령을 하나씩 실행합니다 번호를 입력하십시오. 이렇게하면 마지막 명령을 매우 쉽게 다시 실행할 수 있으며 변수를 증가시켜 다음 명령으로 이동합니다.

명령이 "it.sh"파일에 있다고 가정하고 다음을 차례로 실행하십시오.

$ cat it.sh 
echo "hi there" 
date 
ls -la /etc/passwd 

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1) 
"hi there" 

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1) 
Wed Feb 28 10:58:52 AST 2018 

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1) 
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd 
관련 문제