Sí, sé que C-shell es malo. No, no elegí C-shell. Sí, preferiría usar un caparazón adecuado. No, no puedo cambiar a un shell mejor.
Tengo un script muy simple:
/tmp/env_test.csh
#!/bin/csh -f env
Cuando ejecuto este script desde mi usuario que está conectado con un shell tcsh, SHELL es igual a /bin/tcsh. Cuando ejecuto este script desde cron, SHELL es igual a /bin/sh.
¿Por qué el SHELL no se actualiza correctamente? ¿Qué debo hacer para resolver este problema?
Comentarios
Respuesta
Busque en man 1 csh. La sección Pre-defined and environment variables enumera qué variables csh define o respeta. Hay una variable shell en minúsculas:
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.
Así que echemos un vistazo:
% echo $shell /bin/csh
Comentarios
- Entonces, por lo que puedo decir después de varias pruebas, $ shell no es un entorno real variable, sino más bien una variable interpretada por shell.
echo $shelldevuelve/bin/tcshdel script, peroenv | grep -i shellno encuentra la variable correcta en cron. Según entendí en otros lugares (como esta respuesta ),$SHELLdebería estar configurado. De hecho, en mi shell de inicio de sesión activo, lo es. El único lugar en el que no ' obtengo$SHELLes cron.
Respuesta
Debe establecer la variable SHELL a /bin/csh en su crontrab, puede verificar la variable de entorno cron a través de:
* * * * * env > ~/cron-env tail -f ~/cron-env
El SHELL predeterminado debe establecerse en /bin/sh.
SO: ¿Cómo simular el entorno con el que cron ejecuta un script?
$SHELLno está configurado en el shell correcto. Cuando cron se ejecuta con/bin/sh,$SHELL=/bin/sh, incluso después de iniciar una secuencia de comandos C-shell (#!/bin/csh -f). Perlbrew entonces asume que ' es un shell Bourne y usa comandos del shell Bourne para configurar el entorno. Esto sucede a pesar de ejecutarsource <perlbrew path>/perlbrew/etc/cshrcantes de ejecutarperlbrew use. Resolví esto insertandosetenv SHELL /bin/cshen el cshrc de perlbrew.