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 $shellrestituisce/bin/tcshdallo script, maenv | grep -i shellnon trova la variabile corretta in cron. Ho capito da altri luoghi (come questa risposta ) che$SHELLdovrebbe 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?
$SHELLnon è 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/cshrcprima di eseguireperlbrew use. Ho risolto il problema inserendosetenv SHELL /bin/cshin perlbrew cshrc.