Oui, je sais que C-shell est mauvais. Non, je nai pas choisi C-shell. Oui, je préférerais utiliser un shell approprié. Non, je ne peux pas passer à un meilleur shell.
Jai un script très simpliste:
/tmp/env_test.csh
#!/bin/csh -f env
Lorsque jexécute ce script depuis mon utilisateur qui est connecté avec un shell tcsh, SHELL
est égal à /bin/tcsh
. Lorsque jexécute ce script depuis cron, SHELL
est égal à /bin/sh
.
Pourquoi le SHELL nest-il pas mis à jour correctement? Que dois-je faire pour résoudre ce problème?
Commentaires
Answer
Examinez man 1 csh
. La section Pre-defined and environment variables
répertorie les variables que csh
définit ou respecte. Il y a une variable shell
en minuscules:
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.
Alors jetons un œil:
% echo $shell /bin/csh
Commentaires
- Donc daprès ce que je peux dire après un certain nombre de tests, $ shell nest pas un vrai environnement variable, mais plutôt une variable interprétée par le shell.
echo $shell
renvoie/bin/tcsh
à partir du script, maisenv | grep -i shell
ne trouve pas la variable correcte dans cron. Daprès ce que jai compris dautres endroits (comme cette réponse )$SHELL
doit être défini. En effet, dans mon shell de connexion actif, il lest. Le seul endroit où je ' pour obtenir$SHELL
est cron.
Réponse
Vous devez définir la variable SHELL
à /bin/csh
dans votre crontrab, vous pouvez vérifier la variable denvironnement cron via:
* * * * * env > ~/cron-env tail -f ~/cron-env
La valeur par défaut SHELL
doit être définie sur /bin/sh
.
SO: Comment simuler lenvironnement avec lequel cron exécute un script?
$SHELL
nest pas défini sur le shell correct. Lorsque cron sexécute en utilisant/bin/sh
,$SHELL=/bin/sh
, même après le lancement dun script C-shell (#!/bin/csh -f
). Perlbrew suppose alors quil ' est un Bourne shell et utilise les commandes Bourne shell pour configurer lenvironnement. Cela se produit malgré lexécution desource <perlbrew path>/perlbrew/etc/cshrc
avant dexécuterperlbrew use
. Jai résolu ce problème en insérantsetenv SHELL /bin/csh
dans le cshrc perlbrew.