스크립트를 직접 호출하는 대신 관리자에서`bash -c`를 사용하는 이유는 무엇입니까?


11

supervisord서버에서 서비스를 제어하는 데 사용 하기 시작했습니다 . 나는 리눅스의 프로 사용자는 아니지만 그것을 잘 사용하여 실행할 수 있습니다.

호기심으로, 감독자의 대부분의 명령이 다음과 같이 호출되는 것으로 나타났습니다.

[program:install]
command=bash -c "/src/etc/install.sh"

bash의 사람을 읽었 -c으며 문자열 뒤에 전달 된 변수를 삽입하는 데 사용해야한다는 것을 알고 있습니다.

따라서 bash -c전달 / 사용되는 변수가 없다는 것을 고려하여 스크립트를 직접 호출하는 대신 감독자 (또는 다른 장소) 에서 사용하는 요점은 무엇 입니까?

[program:install]
command=/src/etc/install.sh

감사!

답변:


11

쉘 패스 팽창 (같은 기능 *, ?), 커맨드리스트 ( ;, &&, ||(), 리디렉션 <, >, |,) 만이 인수 문자열 배열로 명령을 분할한다는 supervisord 구현되지 않는다.

bash -c기능은 명령에서 이러한 기능을 사용하려는 유혹을받는 초보 사용자에게 도움 이 될 수 있습니다. 예를 들어 놀랍게도

command=echo foo > /tmp/bar

foo > /tmp/bar에 쓰는 대신 출력 foo합니다 /tmp/bar.

-c변수와 거의 관련이 없습니다. 배쉬에 대한 모든 추가 인수는 스크립트 인수로 사용할 것 $0, $1명령에 등,하지만 기능은 거의 모든 사용이 없습니다. 예를 들어 bash -c 'echo $0 $0' foo출력 foo foo.


1
고마워, 그것은 매우 실용적인 답변이었고 아마 많은 시간을 절약 할 것입니다. 나는 초보 사용자 로서이 실수를 할 것입니다 ( bash -c솔루션으로 생각하지 마십시오 !).
Daniel Costa

6

설명서에 설명 되어 있습니다 .

하위 프로세스를 실행할 때 감독자가 셸을 실행하지 않으므로 USER, PATH, HOME, SHELL, LOGNAME 등과 같은 환경 변수는 기본값에서 변경되거나 다른 방식으로 재 할당되지 않습니다. 이는 구성에서 user = 스탠자를 사용하여 루트로 감독자 실행에서 프로그램을 실행할 때 특히 중요합니다.

이 문제를 해결하기 위해 bash -c사용할 수 있습니다.


2
Mark, 귀하의 답변에 감사드립니다. 그러나 다른 하나는 더 그럴듯한 시나리오라고 생각합니다 (여러분의 대답이 틀린 것은 아니지만 여전히 올바른 답을 하나 선택해야합니다 ..) 게다가, 나는 또한 적은 수의 포인트로 새로운 사용자를 돕고 있습니다.
Daniel Costa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.