[bash] 쉘 명령이 실행될 때 에코하는 방법
쉘 스크립트에서 모든 쉘 명령을 에코하고 변수 이름을 어떻게 확장합니까?
예를 들어 다음과 같은 줄이 있습니다.
ls $DIRNAME
스크립트가 명령을 실행하고 다음을 표시하고 싶습니다.
ls /full/path/to/some/dir
목적은 호출 된 모든 쉘 명령 및 해당 인수의 로그를 저장하는 것입니다. 그런 로그를 생성하는 더 좋은 방법이 있습니까?
답변
set -x
또는 set -o xtrace
변수를 확장하고 줄 앞에 작은 + 부호를 인쇄합니다.
set -v
또는 set -o verbose
인쇄하기 전에 변수를 확장하지 않습니다.
set +x
및 set +v
을 사용 하여 위 설정을 끄십시오.
스크립트의 첫 번째 줄에서 나중에 스크립트에서 (또는 ) 와 동일한 효과를 갖도록 #!/bin/sh -x
(또는 -v
) 넣을 수 있습니다 .set -x
-v
위의에서도 작동합니다 /bin/sh
.
set
속성 및 디버깅 에 대한 bash-hackers 위키를 참조하십시오 .
$ cat shl
#!/bin/bash
DIR=/tmp/so
ls $DIR
$ bash -x shl
+ DIR=/tmp/so
+ ls /tmp/so
$
답변
set -x
당신이 원하는 것을 줄 것입니다.
다음은 셸 스크립트의 예입니다.
#!/bin/bash
set -x #echo on
ls $PWD
명령을 출력하기 전에 모든 변수를 확장하고 전체 명령을 인쇄합니다.
산출:
+ ls /home/user/
file1.txt file2.txt
답변
함수를 사용하여 명령을 에코하고 실행합니다.
#!/bin/bash
# Function to display commands
exe() { echo "\$ $@" ; "$@" ; }
exe echo hello world
어떤 출력
$ echo hello world
hello world
보다 복잡한 명령 파이프 등의 경우 eval을 사용할 수 있습니다.
#!/bin/bash
# Function to display commands
exe() { echo "\$ ${@/eval/}" ; "$@" ; }
exe eval "echo 'Hello, World!' | cut -d ' ' -f1"
어떤 출력
$ echo 'Hello, World!' | cut -d ' ' -f1
Hello
답변
예를 들어, set -x
및 에 줄 바꿈을 사용하여 스크립트에서 선택 라인에 대해 이것을 전환 할 수도 있습니다 set +x
.
#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
echo "grabbing $URL"
set -x
curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
set +x
fi
답변
shuckc의 대답 선택 라인을 반향에 대한 몇 가지 단점을 가지고 : 다음으로 끝날 set +x
명령뿐만 아니라 에코되고, 당신은 함께 종료 코드를 테스트 할 수있는 기능 잃게 $?
가 덮어 도착 이후를 set +x
.
또 다른 옵션은 서브 쉘에서 명령을 실행하는 것입니다.
echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )
if [ $? -eq 0 ] ; then
echo "curl failed"
exit 1
fi
다음과 같은 출력을 제공합니다.
getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed
그러나 명령에 대한 새 서브 쉘을 작성하는 오버 헤드가 발생합니다.
답변
또 다른 옵션은 “-x”를 명령 줄 대신 스크립트 맨 위에 두는 것입니다.
$ cat ./server
#!/bin/bash -x
ssh user@server
$ ./server
+ ssh user@server
user@server's password: ^C
$
답변
초보자를위한 TLDP 의 Bash Guide에 따르면 : 2 장. 스크립트 작성 및 디버깅 :
2.3.1. 전체 스크립트에서 디버깅
$ bash -x script1.sh
…
SourceForge 에서 사용할 수있는 Bash 용 본격적인 디버거가 있습니다 . 이러한 디버깅 기능은 3.x부터 최신 Bash 버전에서 사용할 수 있습니다.
2.3.2. 스크립트의 일부에 대한 디버깅
set -x # Activate debugging from here w set +x # Stop debugging from here
…
표 2-1. 세트 디버깅 옵션 개요
Short | Long notation | Result
-------+---------------+--------------------------------------------------------------
set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
set -v | set -o verbose| Prints shell input lines as they are read.
set -x | set -o xtrace | Print command traces before executing command.
…
또는 원하는 옵션을 첫 번째 행 쉘 선언에 추가하여 스크립트 자체에서 이러한 모드를 지정할 수 있습니다. 일반적으로 UNIX 명령의 경우와 같이 옵션을 결합 할 수 있습니다.
#!/bin/bash -xv