De ce este SHELL îndreptat către / bin / sh într-un script Csh?

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

  • De ce este o problemă oricum?
  • @muru după ce ne-am poticnit și am găsit o soluție, se pare că ' este o problemă, deoarece perlbrew nu ' aparent adecvat " sense " shell-ul este [t] csh dacă $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ării source <perlbrew path>/perlbrew/etc/cshrc înainte de a rula perlbrew use. Am rezolvat acest lucru inserând setenv SHELL /bin/csh în perlbrew cshrc.

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, dar env | 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.

SO: Cum se simulează mediul cron execută un script cu?

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *