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?


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


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

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 ...


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.