Ja, jeg vet at C-shell er dårlig. Nei, jeg valgte ikke C-shell. Ja, jeg foretrekker å bruke et skikkelig skall. Nei, jeg kan ikke bytte til et bedre skall.
Jeg har et veldig forenklet skript:
/tmp/env_test.csh
#!/bin/csh -f env
Når jeg kjører dette skriptet fra brukeren min som er logget på med et tcsh-skall, tilsvarer SHELL
/bin/tcsh
. Når jeg kjører dette skriptet fra cron, tilsvarer SHELL
/bin/sh
.
Hvorfor oppdateres SHELL ikke riktig? Hva må jeg gjøre for å løse dette problemet?
Kommentarer
Svar
Se på man 1 csh
. Avsnittet Pre-defined and environment variables
viser hvilke variabler csh
definerer eller respekterer. Det er en variabel shell
i små bokstaver:
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å la oss se:
% echo $shell /bin/csh
Kommentarer
- Så fra det jeg kan fortelle etter en rekke tester, er $ shell ikke et sant miljø variabel, men snarere en skalltolket variabel.
echo $shell
returnerer/bin/tcsh
fra skriptet, menenv | grep -i shell
finner ikke den riktige variabelen i cron. Det var min forståelse fra andre steder (for eksempel dette svaret ) at$SHELL
skal settes. Faktisk, i mitt aktive påloggingsskall er det. Det eneste stedet jeg ikke får ' t$SHELL
cron.
Svar
Du bør angi SHELL
til /bin/csh
i crontrab, kan du sjekke cron-miljøvariabelen gjennom:
* * * * * env > ~/cron-env tail -f ~/cron-env
Standard SHELL
bør settes til /bin/sh
.
$SHELL
ikke er satt til riktig skall. Når cron kjører med/bin/sh
,$SHELL=/bin/sh
, selv etter å ha startet et C-shell-skript (#!/bin/csh -f
). Perlbrew antar da at ' er et Bourne-skall og bruker Bourne-skallkommandoer for å sette opp miljøet. Dette skjer til tross for at du kjørersource <perlbrew path>/perlbrew/etc/cshrc
før du kjørerperlbrew use
. Jeg løste dette ved å sette innsetenv SHELL /bin/csh
til perlbrew cshrc.