Dlaczego SHELL wskazuje / bin / sh w skrypcie Csh?

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

  • Dlaczego i tak jest to problem?
  • @muru po natknięciu się na to i znalezieniu rozwiązania wydaje się, że ' jest problemem, ponieważ Perlbrew nie ' t najwyraźniej odpowiednio " sense " powłoka to [t] csh, jeśli $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 uruchomienia source <perlbrew path>/perlbrew/etc/cshrc przed uruchomieniem perlbrew use. Rozwiązałem to, wstawiając setenv SHELL /bin/csh do Perlbrew cshrc.

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, ale env | 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?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *