Comment puis-je afficher le chemin absolu dans l'invite bash?

50

J'ai actuellement mon bash PS1réglé sur quelque chose comme ceci:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\w\n\$ "

Comment puis-je lui faire montrer le chemin absolu au lieu du chemin relatif (par exemple /home/dave/dirau lieu de ~/dir)?

David B
la source
1
/home/dave/diret ~/dirles deux sont des chemins absolus, le second utilise une abréviation pour votre répertoire personnel. Un chemin relatif est un chemin relatif à votre répertoire actuel (par exemple ../dir) plutôt que de démarrer à la racine ( /).
Doug Harris
3
ps Belle utilisation de la couleur pour indiquer le statut de sortie de la commande précédente. Probablement la première utilisation de la couleur dans une invite que j'ai aimé.
Doug Harris
@Doug Harris: Merci pour la correction. J'aime aussi cette coloration. Je ne me souviens pas où je l'ai vu pour la première fois (peut-être dans un article précédent du SU?)
David B
\u@\H[\w]:~\$faituser@host[~/path]:~$
JREAM

Réponses:

49

Il suffit de remplacer \wpar \$PWD:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\$PWD\n\$ "

Quoi qu'il en soit, si vous avez un petit conseil, j'écrirais quelque chose comme:

PS1='\[`[ $? = 0 ] && X=2 || X=1; tput setaf $X`\]\h\[`tput sgr0`\]:$PWD\n\$ '
cYrus
la source
4
J'y ai pensé aussi, mais la valeur $PWDest évaluée au moment de l'affectation PS1, pas à chaque appel. Cependant , si vous échappez au signe dollar, cela fonctionnera \$PWD. Avec cela, le signe dollar est un signe dollar au moment de l'affectation et l'évaluation de variable se produit à chaque invite. +1 à vous.
Doug Harris
Bon, j'ai raté ça \, je travaille habituellement avec des guillemets simples si c'est possible. Merci.
cYrus
+1 merci! Pourriez-vous s'il vous plaît expliquer la magie dans votre belle ligne de bash (la «pointe»)?
David B
Sûr. J'ai utilisé tput (voir man tput pour plus d'informations) pour modifier les couleurs plutôt que d'écrire directement les caractères de contrôle, pour des raisons de lisibilité et de portabilité (?). J'ai également supprimé les guillemets doubles et les barres obliques inverses en utilisant des guillemets simples. Enfin, en utilisant une variable, j'ai évité une certaine redondance.
cYrus
23

Mettez dans votre maison .bashrc

PS1='\u@\h:\w\$ '
Alex
la source
7
La clé ici est \wdonne le chemin complet alors que \Wdonne seulement le répertoire. Voir "Séquences d'échappement d'invite de
frappe
0

dans ps1 de bash; -W devrait être relatif, et -w absolu, donc dans ce qui précède, vous devriez déjà avoir l'absolu?!

http://wiki.archlinux.org/index.php/Color_Bash_Prompt

Sirex
la source
3
Je pense que vous confondez absolu | relatif avec full | current_dir. Waffiche uniquement le nom du répertoire actuel, windique le chemin complet, mais utilise toujours des chemins relatifs.
David B
était la terminologie dans l'URL, pas la mienne :)
Sirex
0

Humm ~ / dir est un chemin absolu mais utilise un "raccourci". Par exemple, si vous le faites, cd /usr/localvotre invite affichera probablement le chemin complet de / usr / local. Donc de toute façon, vous avez déjà un chemin complet :-)

Mais probablement votre bonne question est de savoir comment afficher le chemin complet sans aucun raccourci, comme ~?

Cependant, je ne connais pas de réponse à cette question et, en regardant l'homme, il semble en avoir une (du moins documentée).

Huygens
la source
0

Exécuter pwdau lieu d'utiliser \W.

Version simple:

export PS1="\`pwd\` $ "

En utilisant ceci dans votre code:

export PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\`pwd\`\n\$ "
Doug Harris
la source
1
point mineur: selon le guide de style bash de Google, préférez $ (pwd) aux backticks, car les backticks nécessitent un échappement lors de l'imbrication et pas $ ().
funroll