개별 명령에 대해 bash 플래그를 설정하는 방법이 있습니까?

개별 명령에 대해 bash 플래그를 설정하는 방법이 있습니까?

이를 수행하는 더 좋은 방법이 있습니까?

set -x; ls; set +x
# rest of the script

답변1

표시되는 상황에 대해 다음을 사용할 수 있습니다.

( set -x; ls )

set작업은 서브셸 내의 로컬 환경을 수정하지만 서브셸 외부의 환경은 수정하지 않습니다.

서브쉘은 변수 값 등 상위 환경의 어떤 것도 변경할 수 없습니다.

또한 코드는 xtrace끝에서 무조건 셸 옵션을 설정 해제하는 반면(즉, 호출 스크립트에서도 해당 옵션을 끕니다 ), 하위 셸을 사용하면(위에 표시된 대로) 활성 여부에 관계없이 처음부터 bash -x원래 설정을 유지합니다 .set -x

관련된:

답변2

버전 4.4부터 첫 번째 옵션 세트의 옵션( set옵션 없이 //로 설정된 옵션과 반대되는 옵션 세트)을 로컬 옵션 set -o으로 그대로 사용할 수 있습니다(현재 활성화된 옵션 세트를 기록하는 특수 인수). 함수로) 따라서 다음과 같은 함수를 정의할 수 있습니다.shopt -oshopt-olocal -$-

xtrace() {
  local -
  set -o xtrace
  "$@"
}

그리고 전화:

xtrace ls

xtrace이 함수의 컨텍스트 내에서 명령이 호출되므로 예상대로 작동 하지 xtrace return않습니다 .xtrace typeset varxtrace shift

PS4함수에서 로컬로 정의 할 수도 있습니다 .

xtrace() {
  local - PS4='xtrace: running '
  set -o xtrace
  "$@"
}
bash-5.2$ xtrace echo "hello world"
xtrace: running echo 'hello world'
hello world

에 해당하는 구문은 zsh다음과 같습니다.

xtrace() {
  set -o localoptions -o xtrace
  local PS4='...'
  "$@"
}

답변3

주로 "의 의미에 따라 다릅니다.더 나은 것". 예를 들어 서브쉘을 사용할 수 있습니다.

( set -x; ls )

답변4

( ... )플래그를 추가하는 대신 명령을 사용하여 -x새 셸을 호출 할 수도 있습니다 .

bash -x -c 'ls'

이는 현재 환경과 다른 셸을 사용하려는 경우 유용할 수 있습니다.

관련 정보