bash --norc a échoué quand je veux mon script de test avec une sortie propre

0

Je veux que mon script de test puisse être exécuté sans les scripts de démarrage initiaux.

J'ai trouvé l'option "--norc" ne peut pas fonctionner. La version bash est la version 4.2.0 (2)

mon ~ / .bashrc contient

echo "in .bashrc"

Je veux bash --norc -x test.sh produire un contenu sans .bashrc.

$ touch test.sh
$ bash -x test.sh
+ echo 'in .bashrc'
in .bashrc

$ bash --norc -x test.sh
+ echo 'in .bashrc'
in .bashrc

J'ai trouvé que ce problème ne se produit que sur mon système embarqué. Le vrai Linux n'a pas un tel problème.

Daniel YC Lin
la source
1
"Echo $ BASH_ENV" produit-il une sortie? La valeur de ce paramètre est utilisée comme nom d'un fichier à source même pour les shells non interactifs. peut-être est-il réglé sur ".bashrc" quelque part.
Chepner

Réponses:

1

Comme je l'ai mentionné dans mon commentaire, les coquilles non interactives ne sont pas censées lire .bashrcdu tout. Votre question ne devrait donc pas être «Pourquoi --norcne fonctionne- t-il pas? votre question devrait être "Pourquoi ce script shell ( shell non interactif) est-il lu .bashrcen premier lieu?". Une possibilité est que vous ayez une BASH_ENVvariable d'environnement définie sur ~/.bashrc. Si ce n'est pas ça, je ne sais pas, mais voici certaines choses que vous voudrez peut-être essayer:

  • Si votre script ne fait rien de bashspécifique, essayez de l'exécuter avec sh; c'est à dire sh -x test.sh.
  • Créez un testrcfichier avec un fichier echodedans et dites bash -–rcfile testrc -x test.sh.
  • Dis bash -–rcfile /dev/null -x test.sh.
  • Tout et tout ce qui précède sans -x. (Cela ne devrait pas faire une différence, mais ce problème n'a déjà aucun sens.)
  • Exécutez le script en tant que programme normal: chmod +x test.shet puis juste test.sh (ou ./test.sh, si vous n'avez pas .dans votre chemin de recherche). (Vous aurez besoin d'avoir #!/bin/bash, #!/bin/sh, #!/usr/bin/env bashou quelque chose d' équivalent que la première ligne test.sh, mais c'est une bonne pratique de toute façon - voir la discussion grawity .) (Mais cela ne devrait pas faire une différence, non plus .)
  • Et vraiment, vous devriez le faire en premier, mais je ne voulais pas vous ennuyer et vous faire ignorer le reste de ma réponse: Assurez- vous que le problème est ce que vous dites. Vérifiez, revérifier et triple vérifier test.shpour tout sourceou des .commandes qui pourraient (peut - être indirectement) tirer dans .bashrc. De même, voyez s'il appelle d'autres scripts susceptibles de le faire. Vérifiez que le in .bashrcmessage provient réellement de .bashrc–– essayez de le renommer .bashrc(par exemple, en .bashrc.holdou autre) et / ou de le chmodrenvoyer à 0, puis réessayez.
Scott
la source
J'ai simplifié ma question et j'utilise donc tactile pour créer un script shell vide. J'ai testé toute ta suggestion avant de demander. C'est très étrange. Je le teste dans un système embarqué. Mais lorsque je teste sous Linux, cela semble fonctionner.
Daniel YC Lin
La principale raison est 'BASH_ENV', je le désactive, alors cela fonctionne.
Daniel YC Lin
1

--norcs'applique uniquement aux coques interactives; vous démarrez un shell non interactif en fournissant l' test.shargument. Essayez également d’ajouter le -idrapeau pour forcer un shell interactif. (Remarque: ceci peut vous laisser dans le nouveau shell après avoir test.shterminé; je n'ai pas testé.)

Chepner
la source
Cela n'a pas beaucoup de sens. La raison --norcne s'applique qu'aux coques interactives, c'est que les coques non interactives ne sont pas censées lire .bashrcdu tout. Bien sûr, j'aimerais savoir si le fait de spécifier -irésoud le problème, mais cela semble être une façon particulière d'essayer.
Scott
Bon point; J'ai raté la forêt pour les arbres. Je suppose que la vraie question est: pourquoi voit-il une sortie de .bashrc même sans --norc.
Chepner