Posso referenciar um comando antes de '&&' depois de '&&'

10

Não sei de que outra forma formular a pergunta, mas basicamente, geralmente, me pego executando um comando como vagrantpara abrir a VM e depois ssh para ele, como abaixo:

vagrant up && vagrant ssh

Com exceção de escrever minha própria função ou script, existe uma maneira de "reutilizar" a vagrantparte na segunda parte do comando?

jktravis
fonte
Você pode encontrar esta resposta em uma pergunta relacionada útil: unix.stackexchange.com/a/140513/14084
Bernhard

Respostas:

23

Com (t)csh, bashou zshexpansão do histórico, você pode escrever:

vagrant up && !#:0 ssh

Mas, falando sério, você não

Glenn Jackman
fonte
Era isso que eu estava procurando, mas sim. Provavelmente é mais fácil criar um apelido ou função. Obrigado!
Jktravis
@glenn, você poderia explicar o que !#:0significa. Se substituirmos 0 por 1, 2 ou qualquer número, o que isso implicaria?
RAM
4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#refere-se à linha que você está digitando no momento e :0é a primeira palavra da linha ("vagrant"). Então !#:1seria "up", etc
glenn jackman
4
Povo de vaca sagrada. Pare de votar em minha resposta. Considere o esforço mental necessário para a) redigitar "vagabundo" ou b) primeiro lembrar de "! #: 0" e digitar.
Glenn Jackman
13

Você poderia fazer:

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

mas isso não tornaria mais fácil.

Você sempre pode fazer uma função

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

E depois:

doall vagrant up ssh
Stéphane Chazelas
fonte
Boa abordagem! Eu gosto da ideia de poder usá-lo para mais de um aplicativo. Obrigado!
Jktravis
4

Não é diretamente uma resposta, mas duas alternativas talvez valham a pena ser pesquisadas (demais para um comentário):

  1. Alias

    Se você usar repetidamente um comando, poderá colocar um alias no seu ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Histórico da linha de comando

    Ctrl+ Rvamos procurar seus comandos anteriores. Isso será muito mais rápido do que usar variáveis ​​...

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

Isso pode estar próximo do que você está procurando.

Aqui está uma função que - em bash- imprimirá a primeira palavra na posição de comando para o comando composto atual:

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

Com isso você pode fazer:

vagrant up && rc ssh

Um exemplo:

echo up && rc ssh

RESULTADO

up
ssh

ou...

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

RESULTADO

+ 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
fonte