Ja, ik weet dat C-shell slecht is. Nee, ik heb niet voor C-shell gekozen. Ja, ik zou liever een goede schaal gebruiken. Nee, ik kan niet overschakelen naar een betere shell.
Ik heb een heel simplistisch script:
/tmp/env_test.csh
#!/bin/csh -f env
Wanneer ik dit script start vanaf mijn gebruiker die is ingelogd met een tcsh-shell, is SHELL
gelijk aan /bin/tcsh
. Wanneer ik dit script vanuit cron uitvoer, is SHELL
gelijk aan /bin/sh
.
Waarom wordt de SHELL niet correct bijgewerkt? Wat moet ik doen om dit probleem op te lossen?
Opmerkingen
Answer
Kijk naar man 1 csh
. De sectie Pre-defined and environment variables
vermeldt welke variabelen csh
definieert of respecteert. Er is een variabele shell
in kleine letters:
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.
Laten we dus eens kijken:
% echo $shell /bin/csh
Reacties
- Dus van wat ik na een aantal tests kan zien, is $ shell geen echte omgeving variabele, maar eerder een shell-geïnterpreteerde variabele.
echo $shell
retourneert/bin/tcsh
uit het script, maarenv | grep -i shell
vindt de juiste variabele niet in cron. Ik heb begrepen vanuit andere plaatsen (zoals dit antwoord ) dat$SHELL
moet worden ingesteld. Inderdaad, in mijn actieve login-shell is dat zo. De enige plaats waar ik ' niet$SHELL
haal is cron.
Answer
Je moet de SHELL
variabele instellen naar /bin/csh
in je crontrab, kun je de cron-omgevingsvariabele controleren via:
* * * * * env > ~/cron-env tail -f ~/cron-env
De standaard SHELL
moet worden ingesteld op /bin/sh
.
SO: Hoe de omgeving te simuleren waarmee cron een script uitvoert?
$SHELL
niet is ingesteld op de juiste shell. Wanneer cron wordt uitgevoerd met/bin/sh
,$SHELL=/bin/sh
, zelfs na het starten van een C-shell-script (#!/bin/csh -f
). Perlbrew neemt dan aan dat ' een Bourne-shell is en gebruikt Bourne-shell-commandos om de omgeving op te zetten. Dit gebeurt ondanks het uitvoeren vansource <perlbrew path>/perlbrew/etc/cshrc
voordatperlbrew use
wordt uitgevoerd. Ik heb dit opgelost doorsetenv SHELL /bin/csh
in te voegen in de perlbrew cshrc.