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 -o
xtrace on
사용 되면 출력하고 -x
, 그렇지 않으면 출력합니다 xtrace off
.
답변3
@Patrick의 대답은 "정확"하지만 매개변수나 내보낸 변수를 아래 첨자로 전달하여 수행할 작업(예: 추적 켜기)을 지시할 수도 있습니다.
이것의 단점은 입력하려는 모든 스크립트 수준으로 다시 내보내야 한다는 것입니다.
외부 출력 등을 줄이기 위해 동작을 출력/수정하는 데 필요한 스크립트를 선택적으로 추적(또는 영향을 미칠 수 있음)할 수 있다는 장점이 있습니다. 예를 들어, 호출 스크립트에 대한 추적을 끄고 호출된 스크립트에서는 계속 켜둘 수 있습니다. 이것은 전부 아니면 전무라는 제안이 아닙니다.
귀하의 질문에 포함되지 않았지만 관련 내용은 다음과 같습니다.
나는 때때로 다음과 같은 변수를 정의합니다.
E=""
E="echo "
또는
E=""
E=": "
다음과 같이 (여러 문에서) 사용하십시오.
"${E}" rsync ...
또는 두 번째 변형의 경우
"${E}" echo "this is a debugging message"
그런 다음 명령을 실행하고 싶을 때 두 번째 정의를 주석 처리하면 됩니다. 매개변수나 내보낸 변수와 함께 이 기술을 사용할 수도 있습니다.
이 방법은 복합 목록의 첫 번째 문에서만 작동하므로 복합 문에 주의해야 합니다.
답변4
프로세스의 PID를 얻은 다음 ps를 사용하여 프로세스 테이블을 검사하여 해당 매개변수가 무엇인지 확인할 수 있습니다.