Varför pekas SHELL på / bin / sh i ett Csh-skript?

Ja, jag vet att C-shell är dåligt. Nej, jag valde inte C-skal. Ja, jag föredrar att använda ett ordentligt skal. Nej, jag kan inte byta till ett bättre skal.

Jag har ett mycket förenklat skript:

/tmp/env_test.csh

#!/bin/csh -f env 

När jag kör detta skript från min användare som är inloggad med ett tcsh-skal, är SHELL lika med /bin/tcsh. När jag kör det här skriptet från cron är SHELL lika med /bin/sh.

Varför uppdateras SHELL inte korrekt? Vad måste jag göra för att lösa problemet?

Kommentarer

  • Varför är det ändå ett problem?
  • @muru efter att ha snubblat igenom detta och hittat en lösning verkar det som att ' är ett problem eftersom perlbrew inte ' t uppenbarligen lämpligt " sense " skalet är [t] csh om $SHELL inte är inställt på rätt skal. När cron körs med /bin/sh, $SHELL=/bin/sh, även efter att ha startat ett C-shell-skript (#!/bin/csh -f). Perlbrew antar sedan att ' är ett Bourne-skal och använder Bourne-skalkommandon för att ställa in miljön. Detta händer trots att source <perlbrew path>/perlbrew/etc/cshrc körs innan perlbrew use körs. Jag löste detta genom att infoga setenv SHELL /bin/csh till perlbrew cshrc.

Svar

Titta på man 1 csh. Avsnittet Pre-defined and environment variables listar vilka variabler csh definierar eller respekterar. Det finns en variabel shell i gemener:

 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. 

Så låt oss titta:

% echo $shell /bin/csh 

Kommentarer

  • Så från vad jag kan säga efter ett antal tester är $ shell inte en riktig miljö variabel, utan snarare en skaltolkad variabel. echo $shell returnerar /bin/tcsh från skriptet, men env | grep -i shell hittar inte rätt variabel i cron. Det var min uppfattning från andra platser (som detta svar ) att $SHELL ska ställas in. Det är faktiskt i mitt aktiva inloggningsskal. Det enda stället jag inte får ' t $SHELL cron.

Svar

Du bör ställa in variabeln SHELL till /bin/csh i din crontrab kan du kontrollera cron-miljövariabeln genom:

* * * * * env > ~/cron-env tail -f ~/cron-env 

Standard SHELL bör ställas in på /bin/sh.

SO: Hur simulerar jag miljön cron kör ett skript med?

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *