2016-07-14 4 views
1

Kann nicht herausfinden, ob dies möglich ist, aber es wäre sicher bequem.Ich möchte die Ausgabe eines Bash-Befehls erhalten und interaktiv verwenden, um Konstruiere den nächsten Befehl in einer Bash-Shell. Ein einfaches Beispiel hierfür könnte wie folgt aussehen:Bash Capture-Ausgabe des Befehls als unfertige Eingabe für die Befehlszeile

> find . -name myfile.txt 
/home/me/Documents/2015/myfile.txt 

> cp /home/me/Documents/2015/myfile.txt /home/me/Documents/2015/myfile.txt.bak 

Nun, ich tun konnte:

find . -name myfile.txt -exec cp {} {}.bak \; 
or 
cp `find . -name myfile.txt` `find . -name myfile.txt`.bak 
or 
f=`find . -name myfile.txt`; cp $f $f.bak 

Ich weiß, dass. Aber manchmal müssen Sie etwas Komplizierteres tun, als nur eine Erweiterung zu einem Dateinamen hinzuzufügen, und anstatt mit $ {f %% txt} .text.bak usw. in Verbindung zu kommen, wäre es einfacher und schneller (wie Sie die Komplexität erhöhen und noch mehr), um einfach das Ergebnis des letzten Befehls in die Kommandozeile der interaktiven Shell einzufügen und die Editierschlüssel im Emacs-Stil zu verwenden, um das zu tun, was Sie wollen.

Also gibt es eine Möglichkeit, das Ergebnis eines Befehls in die interaktive Shell zurückzuleiten und dort hängen zu lassen. Oder alternativ, um es direkt zum Cut/Paste-Puffer zu leiten und es mit einer schnellen Strg-V wiederherzustellen?

Antwort

4

M-C-e Typing erweitert die aktuelle Befehlszeile, einschließlich Befehlsersetzungen, an Ort und Stelle:

$ $(echo bar) 

M-C-e Typing wird nun Ihre Linie zu

$ bar 

(M-C-e ist die Standardeinstellung für die Bindung ändern Readline-Funktion shell-expand-line.)


Für Ihr spezifisches Beispiel können Sie mit

$ cp $(find . -name myfile.txt) 

, die mit shell-expand-line zu

$ cp /home/me/Documents/2015/myfile.txt 

erweitert beginnen, die Sie dann mit weiteren

$ cp /home/me/Documents/2015/myfile.txt 

Von hier vermehren können, müssen Sie viele Optionen zum Abschließen Ihrer Befehlszeile. Zwei der einfacheren sind

  1. Sie können die Verlaufserweiterung (!#:1.txt) verwenden, um den Zieldateinamen zu erweitern.
  2. Sie können die Klammererweiterung (/home/me/Documents/2015/myfile.txt{,.bak}) verwenden.
+2

Wenn Sie 'vi' Modus verwenden, ist' shell-expand-line' standardmäßig nicht an irgendwas gebunden, aber Sie können den Befehl 'bind' verwenden, um das zu beheben.Ich habe es an '*' gebunden (im normalen Modus von vi), also kann ich ESC- * drücken, um das zu tun. ('bind -m vi-Befehl '*: shell-expand-line'') –

+0

Danke, das wird für mich funktionieren. Ich habe nicht die Tastatur in Xterm standardmäßig, aber ich kann es erstellen. Ich brauche nur die Ausgabe in der Befehlszeile, damit ich sie (ctrl-k) in meinen readline-kill-ring killen kann und dann ctrl zurückschreibe, wenn ich es brauche. – Colin

+0

Übrigens, da ich ein Touchpad verwende, ist es sehr umständlich für mich, dies in der Maus zu machen. Es erfordert die Auswahl der vorherigen Zeile (halten Sie den Daumen gedrückt und ziehen Sie genau), gefolgt von der mittleren Maustaste (drei Finger gleichzeitig tippen). Ich frage mich, wie viele Stunden ich bei diesem Manöver verloren habe. – Colin

2

Wenn Sie auf einem Mac sind, können Sie pbcopy verwenden, um die Ausgabe eines Befehls in die Zwischenablage zu setzen, so dass Sie es in die nächste Befehlszeile einfügen können:

find . -name myfile.txt | pbcopy 

auf einem X-Display, Sie können dasselbe mit xsel --input --clipboard (oder --primary oder möglicherweise einem anderen Auswahlnamen abhängig von Ihrem Fenstermanager) tun. Möglicherweise haben Sie auch xclip zur Verfügung, die ähnlich funktioniert.

+0

ja! Wenn ich --primary statt --clipboard verwende, landet es in meinem x-Auswahlpuffer – Colin

Verwandte Themen