bash 스크립트가 모든 명령을 실행하기 전에 인쇄하도록 만드는 방법은 무엇입니까?


88

예를 들어 간단한 bash 파일이 있습니다.

#!/bin/bash
cd ~/hello
ls

명령을 실행하기 전에 모든 명령을 표시하려면 어떻게해야합니까? Windows 배치 스크립팅에서 "@echo off"의 반대 효과입니다.


1
set옵션이 무엇인지 찾는 사람 은이 매뉴얼 페이지에서 찾을 수 있습니다 .
mkobit

다음과 같이 shebang을 간단히 확장 할 수 있습니다#!/bin/bash -x
sobi3ch

답변:


110
bash -x script

또는

set -x

스크립트에서.

으로 옵션을 다시 설정 해제 할 수 있습니다 set +x. 몇 가지 명령에 대해서만 수행하려면 서브 쉘을 사용할 수 있습니다.`(set -x; command1; command; ...;)


나는 항상 이것을 큰 효과로 사용했습니다. 출력이 처음 예상했던 것보다 약간 더럽게 보입니다.
Scott Pack

2
설정 PS4하면의 프롬프트를 조정할 수 있습니다 -x. 예 : PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( date하지만, 그것을 느려집니다)
월터 Tross

23

이것들은 또한 작동합니다 :

set -v

또는

#!/bin/bash -v

그러나 -v는 각 스크립트 행 앞에 PS4 문자열을 인쇄하지 않으며 "for"문의 단계 (예 :)를 개별적으로 추적하지 않습니다. -x는 주석을 에코하지 않지만 -x는 주석을 에코하지 않습니다.

-v를 사용하는 출력의 예는 다음과 같습니다.

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

-x를 사용한 동일한 스크립트의 결과는 다음과 같습니다.

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

-v와 -x의 차이점을 강조하기 위해 "echo -n"을 포함 시켰습니다. 또한 -v는 "-o verbose"와 동일하지만 후자는 shebang의 일부로 작동하지 않는 것 같습니다.


좋은 설명! 연구를하지 않고 Verbose와 eXplicit이 두 글자가 나타내는 것 같습니다.
Ape-inago

나는 -x가 eXecute에 더 가깝다고 생각한다.
Steven Parkes

10

이것은 또한 작동해야합니다 :

#!/bin/bash -x
cd ~/hello
ls

6

이것은 작동해야합니다 :

set -o verbose #echo on
...
set +o verbose #echo off

4

set -o xtrace그리고 set +o xtrace친구가 (이보다 더 장황하다 -o verbose, 그리고 STDOUT에 로그인 할 때 보이는 장황 반대로 출력, STDERR로 이동).

여기에 더 많은 팁을 보십시오


3

몇 가지 방법이 있습니다.

#!/usr/bin/env bash -x

shebang 라인으로.

set -x스크립트 자체를 포함 하면 기능이 활성화되고 set +x비활성화됩니다. 이 두 가지 방법 모두 이식성이 뛰어난 sh 셸에서 작동합니다.

올바르게 기억한다면 perl에도 -x 옵션이 있습니다.


1

처럼 간다

language -x script

언어 = 파이썬, 펄, bash -x = 연산자 스크립트 = 파일 이름

도움이되기를 바랍니다.


3
-x파이썬에서 에코와 아무 관련이 없습니다
Eugene Pankov

0

#! /bin/bash -x 당신이 원하는 것을합니다.

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