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 $shell
devuelve/bin/tcsh
del script, peroenv | grep -i shell
no encuentra la variable correcta en cron. Según entendí en otros lugares (como esta respuesta ),$SHELL
debería estar configurado. De hecho, en mi shell de inicio de sesión activo, lo es. El único lugar en el que no ' obtengo$SHELL
es 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?
$SHELL
no 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/cshrc
antes de ejecutarperlbrew use
. Resolví esto insertandosetenv SHELL /bin/csh
en el cshrc de perlbrew.