web-dev-qa-db-fra.com

Comment réutiliser la dernière sortie de la ligne de commande?

J'aimerais savoir comment réutiliser la dernière sortie de la console, à savoir:

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**
43
methodofaction

En supposant 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
39
jsbillings

Non encore mentionné, utilisez une variable:

dir=$( python -c ... )
cd "$dir"
13
glenn jackman

Un brouillon 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 dans un fichier. Besoin de sudo.

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

Apropos screendump: un programme nommé Namet ne fonctionne plus pour moi. Peut-être que pour les noyaux plus âgés seulement./dev/pts/n n'a pas fonctionné pour moi aussi. Peut-être que vous devez avoir une option mkdev dans/dev - je me souviens sombre de certains /dev/cuaN, mais je me trompe peut-être.

Nous aimerions pipeler la sortie au lieu d'utiliser Screen.Dump. Mais d'une manière ou d'une autre, cela ne fonctionne pas - parfois, il attend d'entrer.

La capture n'est pas un fil de texte normal avec des lignes ligne, mais avec - par exemple - des caractères 80x50 dans une séquence.

Pour choisir les 2 dernières lignes, 1 pour la sortie de la commande et une pour la ligne d'invite, je l'enlève, choisissez 160 caractères, revenez à nouveau et choisissez 80.

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

Juste au cas où vous vous êtes jamais demandé, pourquoi il y a un programme rev.

La critique:

  • Les premières commandes sont entrées, déplaçant ainsi la ligne ahed. Eh bien, juste une exercice numérique pour choisir la 3ème dernière ligne ou quelque chose. J'ai travaillé principalement dans une fenêtre différente.
  • Tout le monde n'a pas d'écran 80x50. Eh bien, oui, nous savons. Il y a des colonnes $ et des lignes $ pour votre plaisir.
  • La sortie n'est pas toujours en bas. Une coque fraîche et jeune pourrait être dans les rangées supérieures. Bien - simple comme ça: Évaluez ce que Shell est en cours d'exécution. Quelle invite est utilisée. Faites une certaine détection d'invite et trouvez la dernière ligne avec une invite de shell. La ligne avant (ou 2. avant) doit contenir le répertoire.

Le premier diagramme est fabriqué avec expliquer.py

8
user unknown

Essaye ça:

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

Donc, euh, voici une réponse:

Si vous utilisez sous X, sélectionnez la sortie souhaitée avec la souris pour la copier, puis cliquez sur le milieu pour la coller.

Si vous utilisez une console de texte, vous pouvez faire une chose similaire avec GPM .

6
mattdm

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

Dans eshell Intérieur EMACS, ils souhaitaient avoir une telle fonctionnalité, mais elle n'est pas mise en œuvre de manière complète (cependant reflétée dans la documentation ).

Par exemple:

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

~ $ 

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

Mais bien, une programmation ELISP (cf. eshell-mark-output Mise en œuvre dans "ESH-MODE.EL"), et vous pouvez implémenter une fonction qui "marque" la dernière sortie et le renvoie comme le résultat de la fonction; Pour que vous puissiez utiliser cette fonction dans une commande eShell que vous demandez - les fonctions ELISP peuvent être utilisées dans les commandes de eShell avec la syntaxe Elisp habituelle, c'est-à-dire entre parenthèses, comme ceci:

~ $ /bin/echo (buffer-name)
*eshell*
~ $ /bin/echo (car '(a b c))
a
~ $ 
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | tee $(readlink /proc/$$/fd/1))

(Construire sur réponse de 4485 )

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

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

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

Ceci nécessite bien sûr que vous sachiez déjà ce que vous voulez faire avec la sortie, mais a l'avantage d'appeler la commande une seule fois.

0
Tobias Kienzler
$ 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 commande .

0
yasouser

Si vous réalisez que vous allez vouloir réutiliser la sortie avant de frapper Enter, vous pouvez l'enregistrer 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 commande et supprime en fait toute nouvelle ligne finale; cela compte rarement.)

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

Si votre shell est ksh ou zsh, voici une fonction utile que vous pouvez utiliser pour le rendre plus automatique. (Ce n'est aucune aide dans Bash car elle nécessite la dernière commande dans un pipeline à exécuter dans la coque mère, ce qui n'est que le cas dans ksh (non 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 de cette façon:

python -c … |k
cd $kept