Waarom verwijst SHELL naar / bin / sh in een Csh-script?

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

  • Waarom is het eigenlijk een probleem?
  • @muru na hier doorheen te zijn gestruikeld en een oplossing te hebben gevonden, lijkt het ' een probleem te zijn omdat perlbrew niet ' t blijkbaar " sense " de shell is [t] csh als $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 van source <perlbrew path>/perlbrew/etc/cshrc voordat perlbrew use wordt uitgevoerd. Ik heb dit opgelost door setenv SHELL /bin/csh in te voegen in de perlbrew cshrc.

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, maar env | 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?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *