Ano, vím, že C-shell je špatný. Ne, nevybral jsem si C-shell. Ano, raději bych použil správnou skořápku. Ne, nemohu přepnout na lepší prostředí.
Mám velmi zjednodušující skript:
/tmp/env_test.csh
#!/bin/csh -f env
Když spustím tento skript od svého uživatele, který je přihlášen pomocí shellu tcsh, SHELL
se rovná /bin/tcsh
. Když spustím tento skript z cronu, SHELL
se rovná /bin/sh
.
Proč SHELL není správně aktualizován? Co musím udělat, abych tento problém vyřešil?
Komentáře
- Proč je to přesto problém?
- @muru po překonání tohoto problému a nalezení řešení se zdá, že je to ' problém, protože perlbrew zjevně vhodně iv id = „není ' 82bb9a685b „>
sense " shell je [t] csh, pokud $SHELL
není nastaven na správný shell. Když cron běží pomocí /bin/sh
, $SHELL=/bin/sh
, a to i po spuštění skriptu C-shell (#!/bin/csh -f
). Perlbrew pak předpokládá, že ' je prostředí Bourne a nastavuje prostředí pomocí příkazů prostředí Bourne. K tomu dochází navzdory spuštění source <perlbrew path>/perlbrew/etc/cshrc
před spuštěním perlbrew use
. Vyřešil jsem to vložením setenv SHELL /bin/csh
do perlbrew cshrc.
Odpovědět
Podívejte se do man 1 csh
. Sekce Pre-defined and environment variables
uvádí, které proměnné csh
definují nebo respektují. V malých písmenech je proměnná 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.
Pojďme se tedy podívat:
% echo $shell /bin/csh
Komentáře
- Takže z toho, co mohu zjistit po několika testech, $ shell není skutečné prostředí proměnná, ale spíše proměnná interpretovaná pomocí shellu.
echo $shell
vrací/bin/tcsh
ze skriptu, aleenv | grep -i shell
nenalezne správnou proměnnou v cronu. Podle mého chápání z jiných míst (například tato odpověď )$SHELL
by měl být nastaven. Ve svém aktivním přihlašovacím prostředí to skutečně je. Jediné místo, kde ' nedostanu$SHELL
je cron.
Odpověď
Měli byste nastavit proměnnou SHELL
do /bin/csh
ve svém crontrabu můžete zkontrolovat proměnnou prostředí cron pomocí:
* * * * * env > ~/cron-env tail -f ~/cron-env
Výchozí SHELL
by měl být nastaven na /bin/sh
.