Posso fare riferimento a un comando prima di '&&' dopo '&&'


10

Non sono sicuro di come altrimenti formulare la domanda, ma fondamentalmente, spesso mi trovo a eseguire un comando come vagrantper far apparire la VM, e poi ssh in essa come di seguito:

vagrant up && vagrant ssh

A parte scrivere la mia funzione o script, c'è un modo per "riutilizzare" la vagrantparte nella seconda parte del comando?


Potresti trovare utile questa risposta su una domanda correlata: unix.stackexchange.com/a/140513/14084
Bernhard

Risposte:


23

Con (t)csh, basho zshl'espansione della cronologia si potrebbe scrivere:

vagrant up && !#:0 ssh

Ma, seriamente, non lo faresti


Questo è quello che stavo cercando, ma sì. Probabilmente è più semplice eseguire un alias o una funzione. Grazie!
jktravis,

@glenn potresti per favore spiegare cosa !#:0rappresenta. Se sostituiamo 0 con 1, 2 o qualsiasi numero, cosa implicherebbe?
RAM

4
gnu.org/software/bash/manual/bashref.html#History-Interaction - si !#riferisce alla riga che stai scrivendo ed :0è la prima parola della riga ("vagabondo"). Quindi !#:1sarebbe "su", ecc.
Glenn Jackman,

4
Vacca sacra. Smetti di votare la mia risposta. Considera lo sforzo mentale richiesto per a) ridigitare "vagabondo", oppure b) prima ricorda "! #: 0" e poi scrivilo.
Glenn Jackman,

13

Potresti fare:

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

ma ciò non lo renderebbe più semplice.

Potresti sempre fare una funzione

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

E poi:

doall vagrant up ssh

Bel approccio! Mi piace l'idea di poterlo utilizzare per più di un'applicazione. Grazie!
jktravis,

4

Non direttamente una risposta, ma forse vale la pena guardare due alternative (troppo per un commento):

  1. Alias

    Se usi ripetutamente un comando, puoi mettere un alias nel tuo ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Cronologia della riga di comando

    Ctrl+ Rcerchiamo i tuoi comandi precedenti. Questo sarà molto più veloce dell'uso delle variabili ...


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

Potrebbe essere vicino a quello che stai cercando.

Ecco una funzione che - in bash- stamperà la prima parola nella posizione di comando per il comando composto corrente:

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

Con ciò potresti fare:

vagrant up && rc ssh

Un esempio:

echo up && rc ssh

PRODUZIONE

up
ssh

o...

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

PRODUZIONE

+ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.