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
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, menenv | 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
.
$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 atsource <perlbrew path>/perlbrew/etc/cshrc
køres indenperlbrew use
. Jeg løste dette ved at indsættesetenv SHELL /bin/csh
til perlbrew cshrc.