Kyllä, tiedän, että C-shell on huono. Ei, en valinnut C-kuorta. Kyllä, haluaisin mieluummin käyttää oikeaa kuorta. Ei, en voi vaihtaa parempaan kuoreen.
Minulla on hyvin yksinkertainen komentosarja:
/tmp/env_test.csh
#!/bin/csh -f env
Kun suoritan tämän komentosarjan käyttäjältäni, joka on kirjautunut sisään tcsh-kuorella, SHELL
on yhtä suuri kuin /bin/tcsh
. Kun suoritan tämän komentosarjan cronista, SHELL
on yhtä suuri kuin /bin/sh
.
Miksi SHELLiä ei päivitetä asianmukaisesti? Mitä minun on tehtävä ongelman ratkaisemiseksi?
Kommentit
Vastaus
Katso man 1 csh
. Osiossa Pre-defined and environment variables
on luettelo muuttujista, jotka csh
määrittelevät tai kunnioittavat. Pienillä kirjaimilla on muuttuja shell
:
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.
Joten katsotaanpa:
% echo $shell /bin/csh
Kommentit
- Joten siitä, mitä voin kertoa useiden testien jälkeen, $ shell ei ole todellinen ympäristö muuttuja, vaan pikemminkin kuorella tulkittu muuttuja.
echo $shell
palauttaa komentosarjan/bin/tcsh
, muttaenv | grep -i shell
ei löydä oikeaa muuttujaa cronista. Muista paikoista (kuten tämä vastaus ) ymmärsin, että$SHELL
pitäisi asettaa. Todellakin, aktiivisessa kirjautumissähköpostissani se onkin. Ainoa paikka, josta en saa ', et id cron.
Vastaus
Sinun tulisi asettaa muuttuja SHELL
/bin/csh
-sivustolle voit tarkistaa cron-ympäristömuuttujan seuraavasti:
* * * * * env > ~/cron-env tail -f ~/cron-env
Oletusasetuksen SHELL
arvoksi tulisi asettaa /bin/sh
.
SO: Kuinka simuloida ympäristöä, cron suorittaa komentosarjan?
$SHELL
ei ole asetettu oikeaan kuoreen. Kun cron on käynnissä käyttämällä/bin/sh
,$SHELL=/bin/sh
, myös C-shell-komentosarjan käynnistämisen jälkeen (#!/bin/csh -f
). Sitten Perlbrew olettaa ' Bourne-kuoren ja käyttää Bourne-kuorikomentoja ympäristön asettamiseen. Näin tapahtuu huolimatta siitä, ettäsource <perlbrew path>/perlbrew/etc/cshrc
on suoritettu ennenperlbrew use
-ajon suorittamista. Ratkaisin tämän lisäämälläsetenv SHELL /bin/csh
perlbrew-cshrc-tiedostoon.