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 $shellzwraca/bin/tcshze skryptu, aleenv | grep -i shellnie znajduje poprawnej zmiennej w cron. Z innych miejsc (takich jak ta odpowiedź ) wynika, że$SHELLpowinno 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?
$SHELLnie 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/cshrcprzed uruchomieniemperlbrew use. Rozwiązałem to, wstawiającsetenv SHELL /bin/cshdo Perlbrew cshrc.