Hvorfor blir SHELL pekt på / bin / sh i et Csh-skript?

Ja, jeg vet at C-shell er dårlig. Nei, jeg valgte ikke C-shell. Ja, jeg foretrekker å bruke et skikkelig skall. Nei, jeg kan ikke bytte til et bedre skall.

Jeg har et veldig forenklet skript:

/tmp/env_test.csh

#!/bin/csh -f env 

Når jeg kjører dette skriptet fra brukeren min som er logget på med et tcsh-skall, tilsvarer SHELL /bin/tcsh. Når jeg kjører dette skriptet fra cron, tilsvarer SHELL /bin/sh.

Hvorfor oppdateres SHELL ikke riktig? Hva må jeg gjøre for å løse dette problemet?

Kommentarer

  • Hvorfor er det uansett et problem?
  • @muru etter å ha snublet gjennom dette og funnet en løsning, ser det ut til at det ' er et problem fordi perlbrew ikke ' t tilsynelatende passende " sense " skallet er [t] csh hvis $SHELL ikke er satt til riktig skall. Når cron kjører med /bin/sh, $SHELL=/bin/sh, selv etter å ha startet et C-shell-skript (#!/bin/csh -f). Perlbrew antar da at ' er et Bourne-skall og bruker Bourne-skallkommandoer for å sette opp miljøet. Dette skjer til tross for at du kjører source <perlbrew path>/perlbrew/etc/cshrc før du kjører perlbrew use. Jeg løste dette ved å sette inn setenv SHELL /bin/csh til perlbrew cshrc.

Svar

Se på man 1 csh. Avsnittet Pre-defined and environment variables viser hvilke variabler csh definerer eller respekterer. Det er en variabel shell i små bokstaver:

 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å la oss se:

% echo $shell /bin/csh 

Kommentarer

  • Så fra det jeg kan fortelle etter en rekke tester, er $ shell ikke et sant miljø variabel, men snarere en skalltolket variabel. echo $shell returnerer /bin/tcsh fra skriptet, men env | grep -i shell finner ikke den riktige variabelen i cron. Det var min forståelse fra andre steder (for eksempel dette svaret ) at $SHELL skal settes. Faktisk, i mitt aktive påloggingsskall er det. Det eneste stedet jeg ikke får ' t $SHELL cron.

Svar

Du bør angi SHELL til /bin/csh i crontrab, kan du sjekke cron-miljøvariabelen gjennom:

* * * * * env > ~/cron-env tail -f ~/cron-env 

Standard SHELL bør settes til /bin/sh.

SO: Hvordan simulere miljøet cron utfører et skript med?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *