으로 bash
4.1 이상, 당신은 할 수있다
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
bash
로 호출 될 때도 작동합니다 sh
.
기본적으로 우리는 기본값 2 대신 파일 설명자 7에 bash
출력을 출력하고 xtrace
해당 파일 설명자를로 리디렉션합니다 /dev/null
. fd 번호는 임의입니다. 스크립트에서 다르게 사용되지 않는 2보다 큰 fd를 사용하십시오. 이 명령을 입력하는 셸이 bash
또는 yash
인 경우 9보다 큰 숫자를 사용할 수도 있습니다 (파일 설명자가 셸에서 내부적으로 사용되는 경우 문제가 발생할 수 있음).
해당 bash
스크립트를 호출하는 쉘이 is 인 zsh
경우 다음을 수행 할 수도 있습니다.
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
변수가 9보다 큰 첫 번째 자유 fd를 자동으로 할당합니다.
이전 버전의 bash
이 경우, 또 다른 옵션 xtrace
으로 설정되어 set -x
(반대 #! /bin/bash -x
또는 set -o xtrace
) 재정의하는 것입니다 set
통과 할 때 아무것도하지 않는 내 보낸 함수로 -x
그 (또는 다른 경우에 그 스크립트를 끊을 불구하고 ( bash
스크립트는 호출) set
위치 매개 변수를 설정하는 데 사용됨 ).
처럼:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
다른 옵션은 모든 명령 전에 수행 하는 $BASH_ENV
파일에 DEBUG 트랩을 추가하는 것 set +x
입니다.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
set -x
서브 쉘에서 수행 되면 작동하지 않습니다 .
@ilkkachu가 말했듯이 파일 시스템의 모든 폴더에 대한 쓰기 권한이 있으면 최소한 스크립트 사본을 만들어 편집 할 수 있어야합니다.
스크립트 사본을 작성할 수있는 곳이 없거나 원본 스크립트가 업데이트 될 때마다 새 사본을 작성하고 편집하는 것이 편리하지 않은 경우에도 다음을 수행 할 수 있습니다.
bash <(sed 's/set -x/set +x/g' ./script.bash)
스크립트가 스크립트 자체의 위치와 관련이있는 파일을 찾는 등의 $0
특수한 변수 나 특수한 변수를 수행하는 경우 (및 복사 방식)이 제대로 작동하지 않을 $BASH_SOURCE
수 있으므로 $0
스크립트 경로로 바꾸십시오 ...
./script 2>some_file