Ich frage mich, ob es möglich ist, Kettenaktionen im Ubuntu-Terminal durchzuführen, wie zum Beispiel:
action 1 on objectA . then action 2 on objectA
ohne den Namen von objectA wiederholen zu müssen.
Beispiel:
touch file.js && openEditor "$1"
oder etwas ähnliches.
command-line
bash
HoCo_
quelle
quelle
&
wird der "touch" -Befehl in den Hintergrund geschickt. Wenn Sie beabsichtigten, "den Editor zu öffnen, wenn Touch erfolgreich war", dann möchten Sie&&
stattdessenAntworten:
Mit der Bash- History-Erweiterung können Sie auf das n-te Wort der aktuellen Befehlszeile verweisen, indem Sie
!#:n
zquelle
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
Charakter führt eine Geschichte Expansion Ausdruck wenn Sie in einer interaktiven Shell - es ist für on-the-fly - Befehlszeile Manipulation wie Sie schreiben gemeint ist, und ist deaktiviert innen nicht-interaktive Skriptearg1=file.js; touch "$arg1" && openEditor "$arg1"
Es gibt eine praktische Verknüpfung für einen allgemeinen Anwendungsfall. In deinem Beispiel machst du:
Im zweiten Befehl besteht der Trick darin,
openEditor
(mit einem Leerzeichen danach) gefolgt von Alt+ zu schreiben .. Dies fügt das letzte Argument des letzten Befehls einfile.js
. (Wenn es Altaus irgendeinem Grund nicht funktioniert , Escsollte es auch funktionieren.)Da das "Objekt" häufig das letzte Argument des vorherigen Befehls ist, kann es häufig verwendet werden. Es ist leicht zu merken und lässt sich schnell in Ihre intuitiv zu verwendenden Shell-Verknüpfungen integrieren.
Es gibt eine ganze Reihe von Dingen, die Sie damit tun können. Hier ist ein ausführlicher Artikel über die Möglichkeiten: /programming/4009412/how-to-use-arguments-from-previous-command .
Als Bonus funktioniert dies nicht nur in Bash, sondern in allen Programmen, die libreadline für die Verarbeitung von Kommandozeilen-Eingaben verwenden.
quelle
Alt
und drücken2.
(oderEsc
,2
,Esc
,.
), die zweite zum letzten Argument Presse zu bekommenAlt
+-
, Typ2
und drücken SieAlt
+.
(oderEsc
,-2
,Esc
,.
).echo 1 2 3 4
dann ich will2
und3
für den nächsten BefehlAlt
und die Art2.
, drücken Sie die Leertaste, haltenAlt
und Typ3.
- wenn Sie einen Bereich, Nutzung Geschichte Expansion wollen:!!:2-3
.Was den Standard interaktiv Shell
bash
und Scripting Shelldash
geht, können Sie$_
erinnern letztes Argument des letzten Befehls .csh und tcsh haben Verlaufsreferenzen, insbesondere für das letzte Wort des Befehls, das Sie verwenden können
!$
, und für einzelne Argumente!:<index>
:Im Allgemeinen ist es einfach besser,
objectA
einer Variablen zuzuweisen, was auch immer ist , und es in mehreren Befehlen, Schleifen usw. zu verwenden. Alternativ kann eine Funktion eine Wahl sein:quelle
$_
etwas anders funktioniert, als!#:n
wenn letzteres erweitert wird, bevor der Befehl im Verlauf gespeichert wird. Wenn Sie also in die Historie zurückgehen, wird der Befehl mit$_
while!#:n
immer noch durch seinen tatsächlichen Wert ersetzt. Beide haben ihre Vor- und Nachteile.$_
zitiert werden, da es sonst wie alles andere gespalten und globbed wird. (Wir sehen es hier einfach nicht, daecho
die Argumente mit einem Leerzeichen verbunden sind.) Aber zBtouch "hello there"; ls -l $_
funktioniert nicht.$_
ist, dass es portabel ist. Immerhin!#:n
ist bash-spezifisch.Ich würde gegen den in der Antwort von steeldriver angegebenen Verlaufsansatz empfehlen . Dies hängt vom globalen Staat ab, der immer brüchig ist.
Besser ist es, die Schleife über alle benötigten Befehle mit einer geeigneten Variablen im Voraus zu durchlaufen:
Was im Allgemeinen ein kleines Problem ist, ist, dass Bash nicht abbricht, wenn es einen Fehler gibt, dh dies verhält sich tatsächlich so, als
touch foo.txt; gedit foo.txt
würde man mit verketten&&
. Um sicher zu gehen, können Sie Folgendes hinzufügenbreak
:quelle
Beim Kochen eines Einzeilers ordne ich meine wiederholte Sache manchmal einer Shell-Variablen zu, die ich im Befehl mehrmals verwende. Ich kann es aufrufen und bearbeiten, um ein anderes Argument mit Aufwärtspfeil, Strg + a, Strg + Rechtspfeil zu verwenden, um den Cursor in die Nähe des zu bringen
t=
.Beachten Sie, dass dies das Anheften einer Erweiterung oder einer Variation des Namens erleichtert.
Beachten Sie auch, dass ich
;
nach der Variablenzuweisung eine benötige , da diesevar=value cmd
nur als Umgebungsvariable für diesen Befehl festgelegt wird und sich nicht auf den Shell-Kontext auswirkt.quelle