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
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, menenv | 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
.
$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 attsource <perlbrew path>/perlbrew/etc/cshrc
körs innanperlbrew use
körs. Jag löste detta genom att infogasetenv SHELL /bin/csh
till perlbrew cshrc.