Sì, lo so che la shell C è pessima. No, non ho scelto C-shell. Sì, preferirei utilizzare una shell adeguata. No, non posso passare a una shell migliore.
Ho uno script molto semplicistico:
/tmp/env_test.csh
#!/bin/csh -f env
Quando eseguo questo script dal mio utente che ha effettuato laccesso con una shell tcsh, SHELL
è uguale a /bin/tcsh
. Quando eseguo questo script da cron, SHELL
è uguale a /bin/sh
.
Perché SHELL non viene aggiornato in modo appropriato? Cosa devo fare per risolvere questo problema?
Commenti
Answer
Esamina man 1 csh
. La sezione Pre-defined and environment variables
elenca le variabili csh
definite o rispettate. Cè una variabile shell
in minuscolo:
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.
Diamo unocchiata:
% echo $shell /bin/csh
Commenti
- Quindi da quello che posso dire dopo una serie di test, $ shell non è un vero ambiente variabile, ma piuttosto una variabile interpretata dalla shell.
echo $shell
restituisce/bin/tcsh
dallo script, maenv | grep -i shell
non trova la variabile corretta in cron. Ho capito da altri luoghi (come questa risposta ) che$SHELL
dovrebbe essere impostato. In effetti, nella mia shell di accesso attiva, lo è. Lunico posto in cui non ' posso$SHELL
è cron.
Risposta
Devi impostare la variabile SHELL
per /bin/csh
nel tuo crontrab, puoi controllare la variabile dambiente cron tramite:
* * * * * env > ~/cron-env tail -f ~/cron-env
Il valore predefinito SHELL
deve essere impostato su /bin/sh
.
COSÌ: Come simulare lambiente con cui cron esegue uno script?
$SHELL
non è impostata sulla shell corretta. Quando cron è in esecuzione utilizzando/bin/sh
,$SHELL=/bin/sh
, anche dopo aver avviato uno script C-shell (#!/bin/csh -f
). Perlbrew quindi presume che ' sia una shell Bourne e utilizza i comandi della shell Bourne per configurare lambiente. Ciò accade nonostante lesecuzione disource <perlbrew path>/perlbrew/etc/cshrc
prima di eseguireperlbrew use
. Ho risolto il problema inserendosetenv SHELL /bin/csh
in perlbrew cshrc.