예, C-shell이 나쁘다는 것을 압니다. 아니요, C-shell을 선택하지 않았습니다. 예, 적절한 셸을 사용하고 싶습니다. 아니요, 더 나은 셸로 전환 할 수 없습니다.
매우 단순한 스크립트가 있습니다.
/tmp/env_test.csh
#!/bin/csh -f env
tcsh 셸로 로그인 한 사용자로부터이 스크립트를 실행하면 SHELL
가 /bin/tcsh
와 같습니다. cron에서이 스크립트를 실행할 때 SHELL
는 /bin/sh
와 같습니다.
SHELL이 적절하게 업데이트되지 않는 이유는 무엇입니까? 이 문제를 해결하려면 어떻게해야합니까?
댓글
- 그래도 문제가되는 이유는 무엇입니까?
- @muru 이 문제를 해결하고 해결책을 찾은 후에는 perlbrew가 ' 확실히 iv id = “가 아니기 때문에 문제가있는 것 같습니다. ' 82bb9a685b “>
sense " $SHELL
가 올바른 셸로 설정되지 않은 경우 셸은 [t] csh입니다. C-shell 스크립트 (#!/bin/csh -f
). Perlbrew는이를 Bourne 쉘로 가정하고 ' Bourne 쉘 명령을 사용하여 환경을 설정합니다. 이는 perlbrew use
를 실행하기 전에 source <perlbrew path>/perlbrew/etc/cshrc
를 실행하더라도 발생합니다. perlbrew cshrc에 setenv SHELL /bin/csh
를 삽입하여이 문제를 해결했습니다.
Answer
man 1 csh
를 살펴보세요. Pre-defined and environment variables
섹션에는 csh
가 정의하거나 존중하는 변수가 나열되어 있습니다. 소문자로 된 변수 shell
가 있습니다.
shell The file in which the shell resides. This variable is used in forking shells to interpret files that have execute bits set, but which are not executable by the system. (See the descrip- tion of Non-builtin Command Execution below.) Initialized to the (system-dependent) home of the shell.
그러니 살펴 보겠습니다.
% echo $shell /bin/csh
댓글
- 여러 테스트를 거친 후 알 수 있듯이 $ shell은 실제 환경이 아닙니다. 변수이지만 셸 해석 변수입니다.
echo $shell
는 스크립트에서/bin/tcsh
를 반환하지만env | grep -i shell
가 cron에서 올바른 변수를 찾지 못했습니다. 다른 곳 (예 : 이 답변 )에서$SHELL
를 설정해야합니다. 실제로 활성 로그인 셸에서는 설정되어 있습니다. 내가 '$SHELL
를 얻지 못하는 유일한 위치는 cron.
Answer
SHELL
변수를 설정해야합니다. crontrab의 /bin/csh
에 다음을 통해 크론 환경 변수를 확인할 수 있습니다.
* * * * * env > ~/cron-env tail -f ~/cron-env
기본 SHELL
는 /bin/sh
로 설정되어야합니다.