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/tcshvisszatér a szkriptből, deenv | grep -i shellnem találja meg a helyes változót a cronban. Más helyekről megértettem (például ezt a választ ), hogy$SHELLbeállítást. Valóban, az aktív bejelentkezési héjban az. Csak ' nem kapok$SHELLcron.
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?
$SHELLnincs beállítva a megfelelő héjra. Amikor a cron a/bin/sh,$SHELL=/bin/shhaszná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/cshrcfuttatás előtt futott aperlbrew use. Ezt úgy oldottam meg, hogy beillesztettem asetenv SHELL /bin/cshfájlt a perlbrew cshrc-be.