Tak, wiem, że powłoka C jest zła. Nie, nie wybrałem powłoki C. Tak, wolałbym użyć odpowiedniej powłoki. Nie, nie mogę przełączyć się na lepszą powłokę.
Mam bardzo uproszczony skrypt:
/tmp/env_test.csh
#!/bin/csh -f env
Kiedy uruchamiam ten skrypt od mojego użytkownika, który jest zalogowany za pomocą powłoki tcsh, SHELL
równa się /bin/tcsh
. Kiedy uruchamiam ten skrypt z crona, SHELL
równa się /bin/sh
.
Dlaczego POWŁOKA nie jest odpowiednio aktualizowana? Co muszę zrobić, aby rozwiązać ten problem?
Komentarze
Odpowiedź
Zajrzyj do man 1 csh
. Sekcja Pre-defined and environment variables
zawiera listę zmiennych csh
, które są definiowane lub uwzględniane. Istnieje zmienna shell
małymi literami:
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.
Spójrzmy więc:
% echo $shell /bin/csh
Komentarze
- Z tego, co mogę stwierdzić po wielu testach, $ shell nie jest prawdziwym środowiskiem zmienna, ale raczej zmienna interpretowana przez powłokę.
echo $shell
zwraca/bin/tcsh
ze skryptu, aleenv | grep -i shell
nie znajduje poprawnej zmiennej w cron. Z innych miejsc (takich jak ta odpowiedź ) wynika, że$SHELL
powinno być ustawione. Rzeczywiście, w mojej aktywnej powłoce logowania jest. Jedynym miejscem, w którym ' nie otrzymuję$SHELL
, jest cron.
Odpowiedź
Należy ustawić zmienną SHELL
aby /bin/csh
w swoim crontrabie, możesz sprawdzić zmienną środowiskową cron poprzez:
* * * * * env > ~/cron-env tail -f ~/cron-env
Domyślną wartością SHELL
powinno być /bin/sh
.
SO: Jak symulować środowisko, w którym cron wykonuje skrypt?
$SHELL
nie jest ustawiona na właściwą powłokę. Gdy cron działa przy użyciu/bin/sh
,$SHELL=/bin/sh
, nawet po uruchomieniu skryptu powłoki C (#!/bin/csh -f
). Następnie Perlbrew zakłada, że ' jest powłoką Bournea i używa poleceń powłoki Bourne do skonfigurowania środowiska. Dzieje się tak pomimo uruchomieniasource <perlbrew path>/perlbrew/etc/cshrc
przed uruchomieniemperlbrew use
. Rozwiązałem to, wstawiającsetenv SHELL /bin/csh
do Perlbrew cshrc.