web-dev-qa-db-fra.com

commande charabia introuvable au démarrage du terminal bash

J'ai rencontré un problème que je n'arrive pas à comprendre. Lorsque je démarre mon terminal dans Ubuntu (14.04), je reçois le message

sdfsdfsdi: command not found

Comme vous pouvez le voir, il semble que quelqu'un (peut-être moi-même) ait frappé le clavier de frustration, puis a accidentellement écrit dans un script qui bash lit lors de l'initialisation. Le problème est que je ne peux pas pour la vie de moi trouver quel script bash lit quand il rencontre ce charabia. J'ai regardé

~/.profile
~/.bashrc
~/.bash_profile
/etc/profile
/etc/bash.bashrc

et aucun d'entre eux ne semble avoir le charabia. Existe-t-il d'autres emplacements à partir desquels bash lit au démarrage?

Merci!

Andrew

(Notez que ce n'est pas un problème critique, plus qu'un simple ennui mineur).

1
Andrew

Pour trouver de quelles commandes bash s'exécute au démarrage et de quel fichier proviennent ces commandes, exécutez:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

La sortie est longue mais la source du charabia sera, espérons-le, claire.

Explication:

  • PS4='+$BASH_SOURCE> '

    Lors de la création d'une trace d'exécution, bash ajoutera chaque ligne avec une extension de PS4. Ici, nous faisons PS4 affiche le fichier source en cours de lecture.

  • BASH_XTRACEFD=7

    Cela envoie la trace d'exécution à 7 qui est un descripteur de fichier choisi dans l'espoir que c'est un fichier avec lequel les fichiers de démarrage bash ne joueront pas.

  • bash -xl

    Cela démarre bash avec les options -x, ce qui provoque l'affichage de toutes les commandes avec le PS4 Invite et -l qui demande à bash de traiter cela comme un shell de connexion. Si vous n'obtenez pas de charabia sur les shells de connexion, essayez-le sans -l.

  • 7>&2

    Cela redirige la sortie de trace vers stderr pour l'affichage sur le terminal.

Trois raffinements

Sur la base du commentaire de Geirha, cette version ajoute trois améliorations:

PS4='+ $BASH_SOURCE:$LINENO:' BASH_XTRACEFD=7 bash -xlic ""  7>&2

Il y a trois améliorations ici: (1) l'invite PS4 affiche désormais également le numéro de ligne ainsi que le nom du fichier, (2) le -i flag rend le Shell interactif, en plus de -l qui en a fait un shell de connexion, et (3) -c "" provoque la fermeture du shell une fois l'initialisation terminée.

1
John1024

C'est invasif, mais vous pouvez utiliser la technique de débogage la plus ancienne du livre: imprimer des trucs pour marquer où les choses vont mal:

Sudo tee -a /etc/profile <<<'echo /etc/profile'
Sudo tee -a /etc/bash.bashrc <<<'echo /etc/bash.bashrc'
tee -a ~/.profile <<<'echo ~/.profile'
tee -a ~/.bashrc <<<'echo ~/.bashrc'
tee -a ~/.bash_aliases <<<'echo ~/.bash_aliases'
bash -l

Cela réduira la région où se trouvent les ordures, et vous pourrez alors concentrer votre recherche.

0
muru