[bash] 쉘 명령이 실행될 때 에코하는 방법

쉘 스크립트에서 모든 쉘 명령을 에코하고 변수 이름을 어떻게 확장합니까?

예를 들어 다음과 같은 줄이 있습니다.

ls $DIRNAME

스크립트가 명령을 실행하고 다음을 표시하고 싶습니다.

ls /full/path/to/some/dir

목적은 호출 된 모든 쉘 명령 및 해당 인수의 로그를 저장하는 것입니다. 그런 로그를 생성하는 더 좋은 방법이 있습니까?



답변

set -x또는 set -o xtrace변수를 확장하고 줄 앞에 작은 + 부호를 인쇄합니다.

set -v또는 set -o verbose인쇄하기 전에 변수를 확장하지 않습니다.

set +xset +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
$


답변

초보자를위한 TLDPBash 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