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
bash 디버깅 페이지를 읽었 지만 원래 스크립트가 시작되었는지 여부를 알려주는 명확한 옵션이없는 것 같습니다 -x
.
답변
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
답변
set -o
를 사용하면 출력 되고 그렇지 않으면 출력 xtrace on
됩니다 .-x
xtrace off
답변
@Patrick의 답변이 “올바른”답변이지만 추적 기능 켜기와 같이 수행 할 작업을 알려주는 매개 변수 또는 내 보낸 변수를 자식 스크립트에 전달할 수도 있습니다.
이것은 입력하려는 각 스크립트 레벨로 다시 내 보내야한다는 단점이 있습니다.
외부 출력 등을 줄이기 위해 출력 / 수정 된 동작을 필요로하는 스크립트 만 선택적으로 추적 (또는 다른 방식으로 영향) 할 수 있다는 장점이 있습니다. 호출 된 스크립트에서 여전히 켜져 있습니다. 전부가 아니거나 제안이 아닙니다.
귀하의 질문의 일부는 아니지만 관련 :
때로는 다음과 같은 변수를 정의합니다
E=""
E="echo "
또는
E=""
E=": "
다음과 같이 여러 문장으로 사용하십시오.
"${E}" rsync ...
또는 두 번째 변형의 경우
"${E}" echo "this is a debugging message"
그런 다음 명령을 실행하려고 할 때 두 번째 정의를 주석 처리합니다. 대신이 기술을 매개 변수 또는 내 보낸 변수와 함께 사용할 수도 있습니다.
이 중 하나를 사용하면 복합 목록의 첫 번째 명령문에서만 작동하기 때문에 복합 명령문에주의해야합니다.
답변
프로세스의 PID를 잡고 ps로 프로세스 테이블을 검사하여 인수가 무엇인지 확인할 수 있습니다.