Hvorfor peges SHELL på / bin / sh i et Csh-script?

Ja, jeg ved, at C-shell er dårlig. Nej, jeg valgte ikke C-shell. Ja, jeg foretrækker at bruge en ordentlig skal. Nej, jeg kan ikke skifte til en bedre skal.

Jeg har et meget forenklet script:

/tmp/env_test.csh

#!/bin/csh -f env 

Når jeg kører dette script fra min bruger, der er logget ind med en tcsh-skal, er SHELL lig med /bin/tcsh. Når jeg kører dette script fra cron, er SHELL lig med /bin/sh.

Hvorfor opdateres SHELLen ikke korrekt? Hvad skal jeg gøre for at løse dette problem?

Kommentarer

  • Hvorfor er det alligevel et problem?
  • @muru efter at have snublet igennem dette og fundet en løsning, ser det ud til at det ' er et problem, fordi perlbrew ikke ' t tilsyneladende passende " sense " skallen er [t] csh, hvis $SHELL ikke er indstillet til den korrekte shell. Når cron kører ved hjælp af /bin/sh, $SHELL=/bin/sh, selv efter start af et C-shell-script (#!/bin/csh -f). Perlbrew antager derefter, at den ' er en Bourne-skal og bruger Bourne-shell-kommandoer til at indstille miljøet. Dette sker på trods af at source <perlbrew path>/perlbrew/etc/cshrc køres inden perlbrew use. Jeg løste dette ved at indsætte setenv SHELL /bin/csh til perlbrew cshrc.

Svar

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

 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å lad os se:

% echo $shell /bin/csh 

Kommentarer

  • Så hvad jeg kan fortælle efter en række tests, er $ shell ikke et ægte miljø variabel, men snarere en skalfortolket variabel. echo $shell returnerer /bin/tcsh fra scriptet, men env | grep -i shell finder ikke den korrekte variabel i cron. Det var min forståelse fra andre steder (såsom dette svar ), at $SHELL skal indstilles. Faktisk er det i min aktive login-shell. Det eneste sted, jeg ikke ' ikke får $SHELL cron.

Svar

Du skal indstille variablen SHELL til /bin/csh i din crontrab, kan du kontrollere cron-miljøvariablen gennem:

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

Standard SHELL skal indstilles til /bin/sh.

SO: Hvordan simuleres miljøet cron udfører et script med?

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *