97 votes

Quelle est la différence entre PS1 et PROMPT_COMMAND

Tout en prenant un coup d'oeil à ce jeu génial de fil , j'ai remarqué que quelques exemples d'utilisation

PS1="Blah Blah Blah"

et certains l'utilisent

PROMPT_COMMAND="Blah Blah Blah"

(et certains utilisent les deux) lors de la définition de l'invite de commandes dans un shell bash. Quelle est la différence entre les deux? Une SORTE de recherche et même un peu plus large de la recherche sur google ne m'résultats, de sorte que même un lien vers le bon endroit pour chercher la réponse serait appréciée. Merci!

63voto

sashang Points 4548

PROMPT_COMMAND peut contenir ordinaire bash déclarations alors que la PS1 variable peut également contenir des caractères spéciaux, tels que "\h " pour le nom d'hôte, dans la variable.

Par exemple voici mon invite bash qui utilise à la fois PROMPT_COMMAND et PS1. Le bash code dans PROMPT_COMMAND fonctionne que git branch vous pourriez être dedans et l'affiche à l'invite de commandes, avec le statut de sortie de la dernière exécution de processus, nom d'hôte et le nom de base de la ddt. La variable RET stocke la valeur de retour de la dernière exécution du programme. C'est pratique pour voir si il y a une erreur et le code d'erreur de la dernière émission, j'ai couru dans le terminal. Note de l'extérieur " entourant l'ensemble de la PROMPT_COMMAND expression. Il comprend PS1, de sorte que cette variable est réévalué à chaque fois que le PROMPT_COMMAND variable est évaluée.

export PROMPT_COMMAND='RET=$?;\
  BRANCH="";\
  ERRMSG="";\
  if [[ $RET != 0 ]]; then\
    ERRMSG=" $RET";\
  fi;\
  if git branch 2>/dev/null 1>/dev/null; then\
    BRANCH=$(git branch 2>/dev/null | grep \* |  cut -d " " -f 2);\
  fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'

Exemple de sortie ressemble à ceci dans un non-répertoire git:

sashan@dhcp-au-122 Documents  $ false
sashan@dhcp-au-122 Documents  1 $ 

et dans un répertoire git vous voyez le nom de la branche:

sashan@dhcp-au-122 rework mybranch $ 

51voto

Scott Thomson Points 281

Depuis la page de documentation GNU Bash: http://www.gnu.org/software/bash/manual/bashref.html

 PROMPT_COMMAND
    If set, the value is interpreted as a command to execute before
    the printing of each primary prompt ($PS1).
 

Je ne l'ai jamais utilisé, mais j'aurais pu l'utiliser à l'époque où je n'avais que sh.

44voto

Bob Points 171

La différence est que la PS1 est la chaîne d'invite utilisé, et PROMPT_COMMAND est une commande qui est exécutée juste avant l'invite de commandes. Si vous voulez la plus simple et la plus flexible de la construction d'une invite de commandes, essayez ceci:

Mettez ceci dans votre .bashrc:

function prompt_command {
  export PS1=$(~/bin/bash_prompt)
}
export PROMPT_COMMAND=prompt_command

Ensuite, écrire un script (bash, perl, ruby: votre choix), et le placer dans ~/bin/bash_prompt.

Le script peut utiliser toutes les informations qu'il aime, afin de construire une invite de commandes. C'est beaucoup plus simple de l'OMI, parce que vous n'avez pas à apprendre un peu baroque langue de substitution qui a été développé juste pour la PS1 variable.

Vous pourriez penser que vous pourriez faire la même chose en définissant simplement PROMPT_COMMAND directement dans ~/bin/bash_prompt, et réglage de la PS1 à la chaîne vide. Ce qui apparaît au premier abord pour le travail, mais vous découvrirez bientôt que la readline code prévoit PS1 à définir le réel rapide, et lorsque vous faites défiler backwords dans l'histoire, les choses se faire massacrer. Cette solution de contournement causes PS1 à toujours tenir compte de la dernière invite (puisque la fonction définit le réel PS1 utilisé par l'invocation de l'instance de la coquille), et de ce fait, readline et de l'historique des commandes, beau travail.

9voto

Cyker Points 660

PS1 contrôle l'invite bash. Si vous souhaitez simplement définir l'invite, vous n'avez pas besoin de PROMPT_COMMAND .

Cependant, juste avant d’imprimer l’invite, c’est le bon moment, par exemple en définissant de manière dynamique le titre d’un terminal. Et c'est à ce moment-là que vous utilisez PROMPT_COMMAND .

Voir ceci: http://tldp.org/HOWTO/Xterm-Title-3.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: