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).
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.
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.
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.