bash 스크립트를 한 줄씩 실행하는 방법은 무엇입니까?


93

bash -x 옵션을 입력하면 모든 행이 표시됩니다. 그러나 스크립트는 정상적으로 실행됩니다.

줄 단위로 어떻게 실행할 수 있습니까? 그것이 올바른 일을하는지 볼 수 있거나 버그를 중단하고 수정합니다. read모든 줄에 동일한 효과가 적용 됩니다.


답변:


126

모든 줄에 읽을 필요가 없습니다. 다음과 같은 트랩을 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 >

이 경우 스크립트를 중지하려면 다른 셸 에서 스크립트를 종료해야합니다 .


대안 1

스크립트의 다음 명령으로 진행하기 전에 몇 초만 기다리려는 경우 다음 예제가 도움이 될 수 있습니다.

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

< YOUR CODE HERE >

출력을 더 읽기 쉽게 만들기 위해 트랩 명령 내에 set + x 및 set -x를 추가하고 있습니다.


1
그러면 다음 줄로 어떻게 이동합니까 (다음 명령 실행)?
David Doria 2014 년

2
모든 명령에서 읽기를 트랩합니다. 다음 명령으로 이동하려면 return 키를 누르기
organic-mashup

1
이 같은 명령 줄이있는 경우 "하면서 읽기 라인을, 어떻게 $ 선을 에코; somefile <다" "트랩은 DEBUG를 읽기"somefile에서 라인을 읽기 때문에 방법은 작업을하지 않는
mug896

3
어떻게 멈추나요? 스크립트를 끝까지 실행하면 셸이 스크립트가 여전히 실행중인 것처럼 작동합니다.
slashdottir

1
trap 'read -u1' debug파일 읽기 리디렉션 문제를 재정의 하려면 로 변경하십시오 .
user3132194

23

아마도 BASH 디버거 가 당신을위한 것입니다.


3
이것은 정말 최고의 솔루션입니다. 실행되기 전에 라인을 볼 수 있습니다. 대부분의 시스템에서 apt-get install bashdb. 그런 다음 실행 하고을 bashdb your_command.sh입력 step한 다음 캐리지 리턴을 누르면됩니다.
studgeek

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

@Sajuuk, 포장 되지 않을 수 있지만 절대적으로 사용할 수 있습니다 .
Charles Duffy

macOS :brew install bashdb
boweeb

@CharlesDuffy : 기본 Ubuntu 리포지토리에도 없습니다.
Dan Dascalescu

2

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


1

xargs : 라인 필터링 가능

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 원시 입력으로 처리 (이스케이프 없음)
  • -l 각 줄 구분 (공연에는 기본값이 아님)
  • -d \\ n 줄 구분 기호
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.