Da, știu că C-shell este rău. Nu, nu am ales C-shell. Da, aș prefera să folosesc un shell adecvat. Nu, nu pot trece la un shell mai bun.
Am un script foarte simplist:
/tmp/env_test.csh
#!/bin/csh -f env
Când rulez acest script de la utilizatorul meu care este conectat cu un shell tcsh, SHELL
este egal cu /bin/tcsh
. Când rulez acest script de la cron, SHELL
este egal cu /bin/sh
.
De ce SHELL-ul nu este actualizat corespunzător? Ce trebuie să fac pentru a rezolva această problemă?
Comentarii
Răspuns
Căutați în man 1 csh
. Secțiunea Pre-defined and environment variables
listează ce variabile csh
definește sau respectă. Există o variabilă shell
cu litere mici:
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.
Deci, să aruncăm o privire:
% echo $shell /bin/csh
Comentarii
- Deci, din câte pot spune după o serie de teste, $ shell nu este un mediu adevărat variabilă, ci mai degrabă o variabilă interpretată de shell.
echo $shell
returnează/bin/tcsh
din script, darenv | grep -i shell
nu găsește variabila corectă în cron. Am înțeles din alte locuri (cum ar fi acest răspuns ) că$SHELL
ar trebui setat. Într-adevăr, în shell-ul meu activ de conectare, este. Singurul loc în care nu ' nu primesc$SHELL
cron.
Răspuns
Ar trebui să setați variabila SHELL
pentru a /bin/csh
în crontrab, puteți verifica variabila de mediu cron prin:
* * * * * env > ~/cron-env tail -f ~/cron-env
SHELL
implicit ar trebui setat la /bin/sh
.
$SHELL
nu este setat la shell-ul corect. Când cron rulează utilizând/bin/sh
,$SHELL=/bin/sh
, chiar și după lansarea unui script C-shell (#!/bin/csh -f
). Perlbrew apoi presupune că ' este un shell Bourne și folosește comenzile shell Bourne pentru a configura mediul. Acest lucru se întâmplă în ciuda executăriisource <perlbrew path>/perlbrew/etc/cshrc
înainte de a rulaperlbrew use
. Am rezolvat acest lucru inserândsetenv SHELL /bin/csh
în perlbrew cshrc.