Perché SHELL punta a / bin / sh in uno script Csh?

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

  • Perché è comunque un problema?
  • @muru dopo essersi imbattuti in questo e aver trovato una soluzione, sembra che ' sia un problema perché perlbrew non ' è apparentemente appropriato " sense " la shell è [t] csh se $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 di source <perlbrew path>/perlbrew/etc/cshrc prima di eseguire perlbrew use. Ho risolto il problema inserendo setenv SHELL /bin/csh in perlbrew cshrc.

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, ma env | 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?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *