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 $shellretourneert/bin/tcshuit het script, maarenv | grep -i shellvindt de juiste variabele niet in cron. Ik heb begrepen vanuit andere plaatsen (zoals dit antwoord ) dat$SHELLmoet worden ingesteld. Inderdaad, in mijn actieve login-shell is dat zo. De enige plaats waar ik ' niet$SHELLhaal 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?
$SHELLniet 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/cshrcvoordatperlbrew usewordt uitgevoerd. Ik heb dit opgelost doorsetenv SHELL /bin/cshin te voegen in de perlbrew cshrc.