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 $shellreturnerar/bin/tcshfrån skriptet, menenv | grep -i shellhittar inte rätt variabel i cron. Det var min uppfattning från andra platser (som detta svar ) att$SHELLska ställas in. Det är faktiskt i mitt aktiva inloggningsskal. Det enda stället jag inte får ' t$SHELLcron.
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.
$SHELLinte ä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/cshrckörs innanperlbrew usekörs. Jag löste detta genom att infogasetenv SHELL /bin/cshtill perlbrew cshrc.