¿Puedo hacer referencia a un comando antes de '&&' después de '&&'

10

No estoy seguro de qué otra forma formular la pregunta, pero básicamente, a menudo me encuentro ejecutando un comando como vagrantabrir la VM, y luego ingresar en ella como a continuación:

vagrant up && vagrant ssh

Aparte de escribir mi propia función o script, ¿hay alguna forma de "reutilizar" la vagrantparte en la segunda parte del comando?

jktravis
fuente
Puede encontrar útil esta respuesta en una pregunta relacionada: unix.stackexchange.com/a/140513/14084
Bernhard

Respuestas:

23

Con (t)csh, basho la zshexpansión de la historia, podría escribir:

vagrant up && !#:0 ssh

Pero, en serio, no lo harías

Glenn Jackman
fuente
Esto es lo que estaba buscando, pero sí. Probablemente sea más fácil hacer un alias o función. ¡Gracias!
jktravis
@glenn, ¿podría explicar qué !#:0significa? Si reemplazamos 0 con 1, 2 o cualquier número, ¿qué implicaría?
RAM
44
gnu.org/software/bash/manual/bashref.html#History-Interaction - se !#refiere a la línea que está escribiendo actualmente y :0es la primera palabra en la línea ("vagabundo"). Entonces !#:1estaría "arriba", etc.
Glenn Jackman
44
Santo pueblo vaca. Deja de votar mi respuesta. Considere el esfuerzo mental requerido para a) volver a escribir "vagabundo", o b) primero recuerde "! #: 0" y luego escríbalo.
Glenn Jackman
13

Podrías hacerlo:

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

pero eso no lo haría más fácil.

Siempre puedes hacer una función

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

Y entonces:

doall vagrant up ssh
Stéphane Chazelas
fuente
Buen enfoque! Me gusta la idea de poder usarlo para más de una aplicación. ¡Gracias!
jktravis
4

No es directamente una respuesta, pero dos alternativas pueden valer la pena mirar (demasiado para un comentario)

  1. Alias

    Si usa repetidamente un comando, puede poner un alias en su ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Historial de línea de comando

    Ctrl+ te Rpermite buscar tus comandos anteriores. Esto será mucho más rápido que usar variables ...

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

Eso podría estar cerca de lo que estás buscando.

Aquí hay una función que bashimprimirá la primera palabra en la posición del comando para el comando compuesto actual:

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

Con eso podrías hacer:

vagrant up && rc ssh

Un ejemplo:

echo up && rc ssh

SALIDA

up
ssh

o...

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

SALIDA

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