Igen, tudom, hogy a C-shell rossz. Nem, nem a C-shellt választottam. Igen, legszívesebben megfelelő héjat használnék. Nem, nem tudok jobb shellre váltani.
Nagyon leegyszerűsített szkriptem van:
/tmp/env_test.csh
#!/bin/csh -f env
Amikor ezt a szkriptet a tcsh héjjal bejelentkezett felhasználómtól futtatom, SHELL
megegyezik a /bin/tcsh
értékkel. Amikor ezt a szkriptet a cron-ból futtatom, SHELL
egyenlő: /bin/sh
.
Miért nem frissítik megfelelően a SHELL-t? Mit kell tennem a probléma megoldása érdekében?
Megjegyzések
Válasz
Nézze meg a man 1 csh
oldalt. A Pre-defined and environment variables
szakasz felsorolja, hogy a csh
változók melyik változókat definiálják vagy tiszteletben tartják. Van egy shell
változó kisbetűvel:
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.
Tehát nézzük meg:
% echo $shell /bin/csh
Megjegyzések
- Tehát abból, amit számos teszt után meg tudok mondani, a $ shell nem igazi környezet változó, hanem inkább egy shell által értelmezett változó.
echo $shell
/bin/tcsh
visszatér a szkriptből, deenv | grep -i shell
nem találja meg a helyes változót a cronban. Más helyekről megértettem (például ezt a választ ), hogy$SHELL
beállítást. Valóban, az aktív bejelentkezési héjban az. Csak ' nem kapok$SHELL
cron.
Válasz
Be kell állítania a SHELL
változót /bin/csh
a crontrab-ban a cron környezeti változót a következőképpen ellenőrizheti:
* * * * * env > ~/cron-env tail -f ~/cron-env
Az alapértelmezett SHELL
értéket /bin/sh
értékre kell állítani.
SO: Hogyan szimulálhatjuk a környezetet, a cron végrehajt egy szkriptet?
$SHELL
nincs beállítva a megfelelő héjra. Amikor a cron a/bin/sh
,$SHELL=/bin/sh
használatával fut, még egy C-shell parancsfájl elindítása után is (#!/bin/csh -f
). Ezután Perlbrew feltételezi, hogy ' egy Bourne-héj, és Bourne shell-parancsokkal használja a környezet beállítását. Ez annak ellenére történik, hogy asource <perlbrew path>/perlbrew/etc/cshrc
futtatás előtt futott aperlbrew use
. Ezt úgy oldottam meg, hogy beillesztettem asetenv SHELL /bin/csh
fájlt a perlbrew cshrc-be.