Czy mogę odwołać się do polecenia przed „&&” po „&&”

10

Nie jestem pewien, jak inaczej sformułować pytanie, ale w gruncie rzeczy często uruchamiam polecenie takie jak vagrantwywoływanie maszyny wirtualnej, a następnie ssh do niej, jak poniżej:

vagrant up && vagrant ssh

Czy oprócz pisania własnej funkcji lub skryptu istnieje sposób na „ponowne użycie” tej vagrantczęści w drugiej części polecenia?

jktravis
źródło
Możesz znaleźć tę odpowiedź na powiązane pytanie pomocne: unix.stackexchange.com/a/140513/14084
Bernhard

Odpowiedzi:

23

Z (t)csh, bashlub zshekspansji historii pan mógłby napisać:

vagrant up && !#:0 ssh

Ale poważnie, nie zrobiłbyś tego

Glenn Jackman
źródło
Tego właśnie szukałem, ale tak. Prawdopodobnie łatwiej jest zrobić alias lub funkcję. Dzięki!
jktravis,
@glenn czy mógłbyś wyjaśnić, co !#:0oznacza. Jeśli zamienimy 0 na 1, 2 lub dowolną liczbę, to co by to oznaczało?
RAM
4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#odnosi się do aktualnie wpisywanej linii i :0jest pierwszym słowem w linii („włóczęga”). Tak !#:1byłoby „w górę” itd.
glenn jackman
4
Święte krowy. Przestań głosować moją odpowiedź. Rozważ wysiłek umysłowy wymagany do a) przepisania „włóczęgi” lub b) najpierw zapamiętaj „! #: 0”, a następnie wpisz.
glenn jackman
13

Mógłbyś:

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

ale to nie ułatwiłoby tego.

Zawsze możesz wykonać funkcję

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

I wtedy:

doall vagrant up ssh
Stéphane Chazelas
źródło
Niezłe podejście! Podoba mi się pomysł używania go w więcej niż jednej aplikacji. Dzięki!
jktravis,
4

Nie odpowiedź bezpośrednia, ale warto rozważyć dwie alternatywy (za dużo na komentarz):

  1. Alias

    Jeśli wielokrotnie używasz polecenia, możesz umieścić w nim alias ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Historia wiersza poleceń

    Ctrl+ Rpozwól nam przeszukać twoje poprzednie polecenia. Będzie to znacznie szybsze niż używanie zmiennych ...

Sebastian
źródło
4
 v=vagrant; $v up && $v ssh

To może być blisko tego, czego szukasz.

Oto funkcja, która - w bash- wypisze pierwsze słowo w pozycji polecenia dla bieżącego polecenia złożonego:

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

Dzięki temu możesz:

vagrant up && rc ssh

Przykład:

echo up && rc ssh

WYNIK

up
ssh

lub...

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

WYNIK

+ 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
źródło