147 votes

bash - capturer automatiquement la sortie de la dernière commande exécutée dans une variable

J'aimerais être en mesure d'utiliser le résultat de la dernière commande exécutée dans une autre commande. Par exemple,

$ find . -name foo.txt
./home/user/some/directory/foo.txt

Maintenant, disons que je veux être en mesure d'ouvrir le fichier dans un éditeur de texte, ou de le supprimer, ou faire autre chose avec elle, par exemple

mv <some-variable-that-contains-the-result> /some/new/location

Comment puis-je le faire? Peut-être à l'aide de certains bash variable?

Mise à jour:

Pour clarifier, je ne veux pas attribuer les choses manuellement. Ce que je suis après est quelque chose comme intégré dans des variables bash, par exemple

ls /tmp
cd $_

$_ détient le dernier argument de la commande précédente. Je veux quelque chose de similaire, mais avec la sortie de la dernière commande.

Dernière mise à jour:

Seth réponse a plutôt bien fonctionné. Couple de choses à garder à l'esprit:

  • n'oubliez pas d' touch /tmp/x lorsque vous essayez la solution, pour la première fois
  • le résultat ne seront enregistrées que si la dernière commande de code de sortie a été un succès

95voto

Daenyth Points 11297

Je ne sais pas de n'importe quelle variable qui fait cela automatiquement. Faire quelque chose en dehors de copier-coller le résultat, vous pouvez ré-exécuter tout ce que vous venez de le faire, par exemple

vim $(!!)

!! est de l'histoire de l'expansion, qui signifie 'la commande précédente'.

Si vous vous attendez à être un seul fichier avec des espaces ou d'autres caractères qui pourrait empêcher le bon argument de l'analyse, citer le résultat (vim "$(!!)"). Laissant non cotées permettent à plusieurs fichiers à être ouvert à la fois tant qu'ils n'incluez pas d'espaces ou d'autres shell analyse des jetons.

76voto

Seth Robertson Points 13276

C'est vraiment un hacky solution, mais il semble que fonctionnent la plupart du temps de temps en temps. Pendant les tests, j'ai constaté qu'il n'a pas parfois fonctionnent très bien lors de l'obtention d'un ^C sur la ligne de commande, mais je n'ai pas le tordre un peu à se comporter un peu mieux. Ce hack est un mode interactif hack seulement, et je suis assez confiant sur le fait que je ne recommanderais pas à tout le monde. Arrière-plan des commandes sont susceptibles de causer encore moins défini comportement que la normale. Les autres réponses sont un meilleur moyen de par programmation arriver à des résultats.

Cela dit, ici, c'est la "solution":

PROMPT_COMMAND='LAST="`cat /tmp/x`"; exec >/dev/tty; exec > >(tee /tmp/x)'

Définir cette bash variable d'environnement et les questions de commandes en tant désiré. $LAST ont généralement la sortie que vous recherchez:

startide seth> fortune
Courtship to marriage, as a very witty prologue to a very dull play.
                -- William Congreve
startide seth> echo "$LAST"
Courtship to marriage, as a very witty prologue to a very dull play.
                -- William Congreve

19voto

rlibby Points 4061

Bash est une sorte d'laids. Oui, vous pouvez affecter la sortie de variable

MY_VAR="$(find -name foo.txt)"
echo "$MY_VAR"

Mais mieux espère que ton plus dur qu' find seulement retourné un résultat et que les résultats n'ont pas de "bizarre" de caractères, comme les retours chariot ou des retours à la ligne, car ils seront en silence modifiée lorsqu'elle est affectée à une variable Bash.

Mais il vaut mieux être prudent pour citer votre variable correctement lorsque vous l'utilisez!

Il est préférable d'agir sur le fichier directement, par exemple, avec finds' -execdir (consulter le manuel).

find -name foo.txt -execdir vim '{}' ';'

ou

find -name foo.txt -execdir rename 's/\.txt$/.xml/' '{}' ';'

13voto

taskinoor Points 24438

Il y a plusieurs façons de le faire. Une façon est d'utiliser v=$(command) qui va affecter la sortie de commande d' v. Par exemple:

v=$(date)
echo $v

Et vous pouvez utiliser les backquotes trop.

v=`date`
echo $v

De Bash Guide Pour Les Débutants,

Lorsque le vieux-style backquoted forme de substitution est utilisé, la barre oblique inverse conserve son sens littéral, sauf lorsqu'il est suivi par "$", "`","\". La première backticks non précédé d'une barre oblique inverse met fin à la substitution de commande. Lors de l'utilisation de "$(COMMANDE), tous les caractères entre parenthèses composent la commande; aucun n'est traité spécialement.

EDIT: Après la modifier dans la question, il semble que ce n'est pas la chose que l'OP est à la recherche pour. Autant que je sache, il n'y a pas de variable spéciale comme $_ pour la sortie de la dernière commande.

12voto

Wes Hardaker Points 10426

Il est assez facile. Utilisation dos-citations :

Et puis vous pouvez l’utiliser n’importe quel moment dans le futur

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:

X