Kann ich einen Befehl vor '&&' nach '&&' referenzieren?

10

Ich bin mir nicht sicher, wie ich die Frage anders formulieren soll, aber im Grunde führe ich oft einen Befehl aus vagrant, um die VM aufzurufen, und ssh dann wie folgt hinein:

vagrant up && vagrant ssh

Gibt es eine Möglichkeit, den vagrantTeil im zweiten Teil des Befehls "wiederzuverwenden", ohne meine eigene Funktion oder mein eigenes Skript zu schreiben ?

jktravis
quelle
Sie können diese Antwort auf eine verwandte Frage hilfreich finden: unix.stackexchange.com/a/140513/14084
Bernhard

Antworten:

23

Mit (t)csh, bashoder zshGeschichte Expansion Sie können schreiben:

vagrant up && !#:0 ssh

Aber im Ernst, würden Sie nicht

Glenn Jackman
quelle
Das habe ich gesucht, aber ja. Wahrscheinlich ist es einfach einfacher, einen Alias ​​oder eine Funktion auszuführen. Vielen Dank!
Jktravis
@glenn könntest du bitte erklären, wofür !#:0steht. Wenn wir 0 durch 1, 2 oder eine beliebige Zahl ersetzen, was würde das bedeuten?
RAM
4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#bezieht sich auf die Zeile, die Sie gerade eingeben, und :0ist das erste Wort in der Zeile ("Vagabund"). Also !#:1wäre "up", etc
Glenn Jackman
4
Heilige Kuhmenschen. Hör auf, meine Antwort zu stimmen. Betrachten Sie die mentale Anstrengung, die erforderlich ist, um a) "Vagabund" erneut einzugeben oder b) sich zuerst an "! #: 0" zu erinnern und diese dann einzugeben.
Glenn Jackman
13

Du könntest es tun:

eval vagrant\ {'up &&',ssh}

aber das würde es nicht einfacher machen.

Sie könnten immer eine Funktion machen

doall() {
  cmd=$1; shift
  for arg do
    "$cmd" "$arg" || return
  done
}

Und dann:

doall vagrant up ssh
Stéphane Chazelas
quelle
Netter Ansatz! Ich mag die Idee, es für mehr als eine Anwendung verwenden zu können. Vielen Dank!
Jktravis
4

Keine direkte Antwort, aber zwei Alternativen, die vielleicht einen Blick wert sind (zu viel für einen Kommentar):

  1. Alias

    Wenn Sie wiederholt einen Befehl verwenden, können Sie einen Alias ​​in Ihren Befehl einfügen ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Befehlszeilenverlauf

    Ctrl+ RLassen Sie uns Ihre vorherigen Befehle durchsuchen. Dies ist viel schneller als die Verwendung von Variablen ...

Sebastian
quelle
4
 v=vagrant; $v up && $v ssh

Das könnte nahe an dem liegen, wonach Sie suchen.

Hier ist eine Funktion, die - in bash- das erste Wort an der Befehlsposition für den aktuellen zusammengesetzten Befehl druckt:

rc() { $(set -f; unset IFS
        set -- $(history 1)
        IFS="(){};|'\\\"&#"
        set \ $2;IFS=\ ;set -- $*
        printf %s "$1") "$@"; }

Damit könnten Sie tun:

vagrant up && rc ssh

Ein Beispiel:

echo up && rc ssh

AUSGABE

up
ssh

oder...

set -x
(echo);rc 'times two'

AUSGABE

+ echo

+ rc 'times two'
++ set -f
++ unset IFS
+++ history 1
++ set -- 549 '(echo);rc' ''\''times' 'two'\'''
++ IFS='(){};|'\''\"&#'
++ set ' ' echo '' rc
++ IFS=' '
++ set -- echo rc
++ printf %s echo
+ echo 'times two'
times two
mikeserv
quelle