¿Por qué SHELL apunta a / bin / sh en un script Csh?

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

  • ¿Por qué es un problema de todos modos?
  • @muru después de tropezar con esto y encontrar una solución, parece que ' es un problema porque perlbrew no ' aparentemente " sense " el shell es [t] csh si $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 ejecutar source <perlbrew path>/perlbrew/etc/cshrc antes de ejecutar perlbrew use. Resolví esto insertando setenv SHELL /bin/csh en el cshrc de perlbrew.

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, pero env | 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?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *