-x 호출을 사용하여 현재 실행 중인 bash 스크립트가 디버깅되었는지 확인하는 방법은 무엇입니까?

-x 호출을 사용하여 현재 실행 중인 bash 스크립트가 디버깅되었는지 확인하는 방법은 무엇입니까?

launch.sh올바른 소유자의 파일을 생성하기 위해 다른 사용자로 실행되는 스크립트가 있습니다 . 처음에 스크립트에 전달된 경우 이 호출에 -x를 전달하고 싶습니다.

if [ `whoami` == "deployuser" ]; then
  ... bunch of commands that need files to be created as deployuser
else
  echo "Respawning myself as the deployment user... #Inception"
  echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
  sudo -u deployuser -H bash $0 "$@"  # How to pass -x here if it was passed to the script initially?
fi

내가 읽고배시 디버그 페이지그러나 원본 스크립트가 -x.

답변1

bash명령줄에 전달할 수 있는 많은 플래그는 set플래그입니다. set런타임에 이러한 플래그를 전환할 수 있는 셸이 내장되어 있습니다. 예를 들어, 스크립트를 호출하는 것은 bash -x foo.sh본질적으로 스크립트 상단에서 수행하는 것과 동일합니다.set -x

set이것이 내장된 쉘이 담당하는 것임을 알면 우리는 어디를 봐야 할지 알 수 있습니다. 이제 이 작업을 수행 help set하면 다음과 같은 결과를 얻을 수 있습니다.

$ help set
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
...
      -x  Print commands and their arguments as they are executed.
...
    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.
...

따라서 여기에서 $-어떤 플래그가 활성화되어 있는지 알 수 있습니다.

$ bash -c 'echo $-'
hBc

$ bash -x -c 'echo $-'
+ echo hxBc
hxBc

따라서 기본적으로 다음을 수행하면 됩니다.

if [[ "$-" = *"x"* ]]; then
  echo '`-x` is set'
else
  echo '`-x` is not set'
fi

보너스로 모든 로고를 복사하고 싶다면 그렇게 할 수도 있습니다.

bash -$- /other/script.sh

답변2

set -oxtrace on사용 되면 출력하고 -x, 그렇지 않으면 출력합니다 xtrace off.

답변3

@Patrick의 대답은 "정확"하지만 매개변수나 내보낸 변수를 아래 첨자로 전달하여 수행할 작업(예: 추적 켜기)을 지시할 수도 있습니다.

이것의 단점은 입력하려는 모든 스크립트 수준으로 다시 내보내야 한다는 것입니다.

외부 출력 등을 줄이기 위해 동작을 출력/수정하는 데 필요한 스크립트를 선택적으로 추적(또는 영향을 미칠 수 있음)할 수 있다는 장점이 있습니다. 예를 들어, 호출 스크립트에 대한 추적을 끄고 호출된 스크립트에서는 계속 켜둘 수 있습니다. 이것은 전부 아니면 전무라는 제안이 아닙니다.

귀하의 질문에 포함되지 않았지만 관련 내용은 다음과 같습니다.

나는 때때로 다음과 같은 변수를 정의합니다.

E=""
E="echo "

또는

E=""
E=": "

다음과 같이 (여러 문에서) 사용하십시오.

"${E}" rsync ...

또는 두 번째 변형의 경우

"${E}" echo "this is a debugging message"

그런 다음 명령을 실행하고 싶을 때 두 번째 정의를 주석 처리하면 됩니다. 매개변수나 내보낸 변수와 함께 이 기술을 사용할 수도 있습니다.

이 방법은 복합 목록의 첫 번째 문에서만 작동하므로 복합 문에 주의해야 합니다.

답변4

프로세스의 PID를 얻은 다음 ps를 사용하여 프로세스 테이블을 검사하여 해당 매개변수가 무엇인지 확인할 수 있습니다.

관련 정보