Pourquoi SHELL pointe-t-il vers / bin / sh dans un script Csh?

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

  • Pourquoi est-ce un problème de toute façon?
  • @muru après avoir trébuché sur ce problème et trouvé une solution, il semble que ' soit un problème car perlbrew ne ' t apparemment de manière appropriée " sense " le shell est [t] csh si $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 de source <perlbrew path>/perlbrew/etc/cshrc avant dexécuter perlbrew use. Jai résolu ce problème en insérant setenv SHELL /bin/csh dans le cshrc perlbrew.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *