Comment réutiliser la dernière sortie de la command line?

C'est une question nonob, mais j'aimerais savoir comment réutiliser la dernière sortie de la console, c'est à dire:

pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" /Library/Python/2.6/site-packages pv-3:method Xavier$ cd **LASTOUTPUT** 

En supposant que bash:

 % python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" /usr/lib/python2.7/site-packages % cd $(!!) cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()") % pwd /usr/lib/python2.7/site-packages 

Pas encore mentionné, utilisez une variable:

 dir=$( python -c ... ) cd "$dir" 

Essaye ça:

 $ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()") $ pwd /Library/Python/2.6/site-packages 

Toutes les autres solutions impliquent la modification de votre stream de travail ou l'exécution de la command deux fois, ce qui peut ne pas convenir si son exécution est longue ou si elle n'est pas reproductible (par exemple, elle supprime un file).

Donc, voici une idée plus compliquée si vous en avez besoin:

.bashrc

 exec > >(tee -a ~/$$.out) PROMPT_COMMAND='LASTLINE=$(tail -n 1 ~/$$.out)' trap 'rm ~/$$.out' EXIT 

invite bash

 $ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" /usr/lib/python2.6/dist-packages $ cd $LASTLINE $ pwd /usr/lib/python2.6/dist-packages 

Cela a des problèmes, donc c'est simplement un sharepoint départ. Par exemple, le file de sortie ( ~/<pid>.out ) peut devenir très volumineux et remplir votre disque. En outre, toute votre coquille pourrait cesser de fonctionner si le tee meurt.

Il pourrait être modifié pour capturer uniquement la sortie de la command précédente en utilisant les preexec et precmd dans zsh, ou une émulation d'eux dans bash, mais c'est plus compliqué à décrire ici.

Donc, euh, voici une réponse:

Si vous exécutez sous X, select la sortie que vous voulez avec la souris pour la copyr, puis faites un clic droit pour la coller.

Si vous utilisez une console text, vous pouvez faire une chose similaire avec gpm .

Un projet de travail pour une coquille traditionnelle:

 ttyid=$(readlink /proc/$$/fd/1) \___/ \______/ \___/ | | | | | | | | \- 0: stdin | | | | | 1: stdout <- our interest | | | | | 2: stderr | | | | \- fd is, maybe, filedescriptor | | | | | | | \- $$ is the PID of the current process (shell, | | | in our case) | | | | | \- you know, much runtime stuff is here | | | \- readlink extracts the symbolic link of /proc/$$/fd/1 | lrwx------ 1 stefan stefan 64 2011-03-18 09:11 | /proc/22159/fd/1 -> /dev/pts/4 | \- /dev/tty3 for real shell, /dev/pts/3 for xterm 

Maintenant, nous pouvons chat l'écran à un file. A besoin de sudo.

 id=${ttyid//\/dev\/tty} sudo cat /dev/vcs$id > screen.dump 

Apropos screendump : programme ainsi nommé ne fonctionne plus pour moi. Peut-être pour les vieux kernelx seulement. / dev / pts / N n'a pas fonctionné pour moi aussi. Peut-être que vous avez un MKDEV facultatif dans / dev – je me souviens de /dev/cuaN , mais je peux me tromper.

Nous voudrions canaliser la sortie au lieu d'utiliser screen.dump. Mais de toute façon cela ne fonctionne pas – parfois, il attend ENTER.

La capture n'est pas un file text normal avec des sauts de ligne, mais avec – par exemple – 80×50 caractères dans une séquence.

Pour sélectionner les 2 dernières lignes, 1 pour la sortie de la command et une pour la ligne d'invite, je la réinitialise, sélectionne 160 caractères, reviens à nouveau et choisis 80.

 rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g' 

Juste au cas où vous vous êtes déjà demandé, pourquoi il y a un programme de rev .

La critique:

  • Les premières commands sont inputs, déplaçant ainsi la ligne ahed. Eh bien – juste un exercice numérique pour choisir la troisième-dernière ligne ou quelque chose. J'ai travaillé principalement dans une window différente.
  • Tout le monde n'a pas un écran 80×50. Eh bien, oui, nous soaps. Il y a $ COLUMNS et $ ROWS pour votre plaisir.
  • La sortie n'est pas toujours au fond. Une coquille fraîche et jeune pourrait être dans les rangées supérieures. Eh bien – simple comme ça: Évaluer ce que le shell est en cours d'exécution. Quelle invite est utilisée. Faites une détection rapide et trouvez la dernière ligne avec une invite shell. La ligne avant (ou 2. avant) devrait contenir le directory.

Le premier diagramme est fait avec explain.py

(Ce n'est pas une réponse de travail, malheureusement, mais quelque chose de curieux. Une personne intéressée pourrait bien essayer de compléter la mise en œuvre de la fonctionnalité dont je vais vous parler).

En eshell intérieur d'Emacs, ils voulaient avoir une telle fonctionnalité mais elle n'est pas implémentée de manière complète (ce qui est cependant reflété dans la documentation ).

Par exemple:

 ~ $ pwd ~ ~ $ /bin/echo $$ ~ ~ $ /bin/pwd /home/imz ~ $ /bin/echo $$ ~ $ 

Vous voyez, seule la sortie des builtins peut être capturée dans la variable $$ .

Mais bien, une certaine programmation elisp (voir l' eshell-mark-output dans "esh-mode.el") et vous pourriez implémenter une fonction qui "marque" la dernière sortie et la renvoie comme résultat de la fonction; afin que vous puissiez utiliser cette fonction dans une command eshell que vous requestz – les fonctions elisp peuvent être utilisées dans les commands eshell avec la syntaxe habituelle elisp, c'est à dire entre parenthèses, comme ceci:

 ~ $ /bin/echo (buffer-name) *eshell* ~ $ /bin/echo (car '(abc)) a ~ $ 

Si vous réalisez que vous souhaitez réutiliser la sortie avant d'appuyer sur Entrée , vous pouvez l'save dans une variable: ajoutez tmp=$( au début de la ligne et ) à la fin. (Cela supprime toute ligne vide à la fin de la sortie de la command, et en fait supprime toute nouvelle ligne, ce qui est très important.)

 tmp=$( python -c … ) echo "$tmp" cd "$tmp" 

Si votre shell est ksh ou zsh, voici une fonction utile que vous pouvez utiliser pour rendre cela plus automatique. (Cela ne sert à rien dans bash car il faut que la dernière command d'un pipeline soit exécutée dans le shell parent, ce qui n'est le cas que dans ksh (pas pdksh) et zsh).

 keep () { local line IFS=$'\n' kept= while read -r line; do printf '%s\n' "$line" kept=$kept$line$IFS done } alias keep=k 

Utilisez-le comme ceci:

 python -c … |k cd $kept 
 cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | tee $(readlink /proc/$$/fd/1)) 

(en s'appuyant sur la réponse de 4485 )

C'est beaucoup de taper, alors faites un alias:

 alias tee2tty='tee $(readlink /proc/$$/fd/1)' 

Ensuite, appelez simplement cd $(python -c ... | tee2tty)

Bien sûr, cela vous oblige à savoir déjà ce que vous voulez faire avec la sortie mais a l'avantage d'appeler la command une seule fois.

 $ cd \`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"\` 

fera l'affaire.

Lisez ici pour plus de détails: Substitution de command .

Il y a une meilleure solution:

Il suffit d'imprimer !! après exécution de la command et vous obtiendrez une sortie répétée.

Par exemple

entrer la description de l'image ici

Original:

https://askubuntu.com/questions/324423/how-to-access-the-last-return-value-in-bash