2010-10-25 4 views
2

Je voudrais configurer mon Bash de manière à ce que je puisse tirer du texte de la commande précédente stdout. L'exemple d'utilisation que je vais utiliser est la résolution de conflits lors d'un rebas git.Yanking du texte de la précédente stdout sur la ligne de commande

$ git status 
# Not currently on any branch. 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  app/views/report/index.html.erb 
# 
$ vim app/views/report/index.html.erb 
# .... edit, resolve conflicts .... 
$ git add <Alt+.> 

Le problème est que la meilleure façon de saisir le nom du fichier pour la 2ème commande (vim ...) est de déplacer ma main sur la souris. Une option est screen, mais cela a son propre ensemble de problèmes comme un shell au jour le jour. (Ce n'est pas le moins que j'utilise et que j'utilise Ctrl + A comme raccourci readline)

Où pourrais-je commencer à faire ce travail pour moi? Idéalement, je voudrais pouvoir tirer la ligne N th à partir de la sortie standard de la commande précédente, quelque part que je puisse la manipuler comme une commande.

Répondre

2

autres que d'utiliser la souris, la seule façon que je peux penser est d'utiliser grep, sed et/ou awk, peut-être avec tee et/ou une substitution de fonction Bash et processus et/ou d'un procédé et/ou substitution de commande:

vim $(git status | tee /dev/tty | grep ...) 

ou

var=$(git status | tee /dev/tty | grep ...) 
vim "$var" 
git add "$var" 

le tee vous permet de voir la pleine puissance tout en capturant la sortie modifiée. Création d'une fonction vous permettra de passer facilement un argument qui choisirait une certaine ligne:

var=$(some_func 14) 
etc. 

L'inconvénient est que vous devez faire cela depuis le début. Je ne connais aucun moyen de le faire après le fait sans utiliser screen ou une autre sortie de journalisation et de script un fouiller dans le journal.

+0

Ouais, il devient évident que je devrai modifier mon environnement pour capturer stdout/stderr puis écrire quelque chose à tirer ces lignes vos suggestions semblent bonnes, mais je ne suis pas sûr. comment j'obtiendrais ceci d'une variable sur la ligne de commande de bash (c.-à-d. développez la variable en ligne, ou mieux faites tout cela à partir d'une touche de raccourci) – Shaun

+0

@Shaun: Avez-vous vraiment besoin de l'agrandir? Tu ne peux pas juste référencer la variable comme dans mon exemple? Vous pouvez appuyer sur Ctrl-Alt-e pour développer la variable sur la ligne de commande si nécessaire (elle fera d'autres extensions en même temps). Recherchez "shell-expand-line" dans "man bash" pour plus d'informations. Malheureusement, les fonctions readline ne peuvent pas être appelées par programmation. –

+0

C'est dommage - c'est plus d'effort que de simplement utiliser la souris pour le faire. J'espérais pouvoir le coder, mais on dirait que ce n'est pas vraiment une option sans modifier Bash. Merci d'avoir répondu. – Shaun

0
tuyau

la sortie par sed:

git status | sed -n '5p' 

pour obtenir la 5ème ligne

1

Je ne sais pas d'une bonne solution propre, mais comme un hack vous pouvez essayer la commande script, qui enregistre toutes les entrées et sorties dans un fichier. Pour GNU script:

$ script -f 
Script started, file is typescript 
$ ls -1 
bar 
baz 
foo 
typescript 
$ echo $(tail -3 typescript | head -1) 
foo 
Questions connexes