비대화형, 비로그인 쉘 및 크론 작업과 관련된 몇 가지 질문이 있습니다.
Q1.비대화형, 비로그인 쉘은 "load"만 가능하다는 것을 읽었습니다 $BASH_ENV
. 이것이 정확히 무엇을 의미하나요? 이것은 내가 $BASH_ENV
파일을 가리키면 파일을 가져올 수 있다는 뜻입니까 ?
2분기cron
: Bash shebang을 사용하여 Bash 스크립트를 가리키는 항목이 있다고 가정할 때 Bash 스크립트가 로드된다고 가정할 수 있는 환경 변수 및 정의는 무엇입니까?
3분기SHELL=/bin/bash
: 내 상단에 추가하면 crontab
정확히 무엇을 합니까? 이것은 다음을 의미합니까?
cron
Bash에서 자체적으로 실행되나요?- 주문하다지정됨
crontab
Bash로 해석됩니까 ? - 다음을 수행하는 스크립트아니요그 중
shebangs
아래를 실행해 보세요.$SHELL
다른 것이 있나요?
4 분기BASH_ENV
: 크론 작업을 설정하는 방법은 무엇입니까 ?
답변1
Q1과 Q2에 대해서는 다음을 참조하세요.여기. Q3은 다른 세 가지 질문에 대한 아래 토론에서 답변됩니다.
WRT $BASH_ENV
, 출처 man bash
:
예를 들어 bash가 비대화형으로 시작되면 쉘 스크립트를 실행하기 위해 환경에서 BASH_ENV 변수를 찾고 해당 값이 있으면 확장한 다음 확장된 값을 파일 이름으로 사용하여 읽고 실행합니다.
따라서 이것은 아마도 .profile
타자기로 작성된 스크립트일 것입니다. 어디서 또는 누가 설정하는지는 상황에 따라 다릅니다. 일반적으로 설정되지 않지만 현재 프로세스의 조상에 의해 설정될 수 있습니다. cron
이에 대한 특별한 용도는 없는 것 같으며 AFAIK는 init를 사용하지 않습니다.
이것은 cron 자체가 Bash에서 실행된다는 것을 의미합니까?
"in"이 셸에서 시작한다는 의미라면 init 시스템에 따라 다릅니다. 예를 들어 SysV는 서비스에 대한 셸 스크립트를 실행하므로 해당 서비스는 항상 셸을 통해 시작됩니다.
그러나 "in"이 "쉘 프로세스의 하위 프로세스입니까?"를 의미한다면,아니요. 다른 데몬과 마찬가지로 자체 프로세스 그룹의 리더로 실행되며 상위 프로세스는 init 프로세스(pid 1)입니다.
cron
그러나 환경에 미치는 영향은 크지 않을 수 있습니다. 스타트업 서비스 환경에 대한 자세한 내용은 위에 링크된 Q1, Q2 답변을 참고하시기 바랍니다. WRT는 특히 cron을 대상으로 하며 man 5 crontab
이에 따르면세트여러 환경 변수 ( 및 $LOGNAME
) 가 시작된 프로세스에서 상속됩니다 .$HOME
$SHELL
crontab에 지정된 명령이 Bash에서 해석됩니까?
sh
다음에서 또는 를 사용하여 $SHELL
다시 설명 합니다 man 5 crontab
.
줄 바꿈 또는 "%" 문자까지 줄의 전체 명령 부분을 /bin/sh 또는에서 읽습니다.cronfile의 SHELL 변수에 지정된 쉘에 의해 실행됩니다. 백슬래시()로 이스케이프하지 않는 한 명령의 "%" 문자는 개행 문자로 변경되고 첫 번째 % 이후의 모든 데이터는 표준 입력으로 명령에 전송됩니다.
강조 표시된 부분은 Q3에 대한 답변입니다.
Shebang이 없는 스크립트는 $SHELL을 사용하여 실행됩니다.
$SHELL
shebang이 있거나 없는 실행 가능한 스크립트는 ( 또는 )로 열립니다 sh
. 차이점은 shebang을 사용하는 경우 적절한 통역사( #!/bin/sh
셸의 또 다른 인스턴스로) 에게 전달된다는 것입니다 .실행 가능 파일shebang이 없는 스크립트(실행 파일로 참조되는 실행 가능 비트 세트가 있는 스크립트)는 명령줄에서 실행할 때와 마찬가지로 실패합니다(실행하지 않는 한 sh script.sh
).