Puis-je référencer une commande avant «&&» après «&&»

10

Je ne sais pas comment formuler la question autrement, mais au fond, je me retrouve souvent à exécuter une commande comme vagrantfaire apparaître la machine virtuelle, puis à y faire ssh comme ci-dessous:

vagrant up && vagrant ssh

À moins d'écrire ma propre fonction ou mon propre script, existe-t-il un moyen de "réutiliser" la vagrantpartie de la deuxième partie de la commande?

jktravis
la source
Vous pourriez trouver cette réponse utile pour une question connexe: unix.stackexchange.com/a/140513/14084
Bernhard

Réponses:

23

Avec (t)csh, bashou zshexpansion de l'histoire, vous pouvez écrire:

vagrant up && !#:0 ssh

Mais sérieusement, vous ne le feriez pas

glenn jackman
la source
C'est ce que je cherchais, mais oui. Probablement juste plus facile de faire un alias ou une fonction. Merci!
jktravis
@glenn pourriez-vous s'il vous plaît expliquer ce que !#:0signifie. Si nous remplaçons 0 par 1, 2 ou n'importe quel nombre, qu'est-ce que cela impliquerait?
RAM
4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#fait référence à la ligne que vous êtes en train de taper et :0est le premier mot de la ligne ("vagabond"). Ce !#:1serait "up", etc
glenn jackman
4
Peuple de vache sacrée. Arrêtez de voter pour ma réponse. Considérez l'effort mental requis pour a) retaper "vagabond", ou b) d'abord vous rappeler "! #: 0" puis le taper.
glenn jackman le
13

Vous pourriez faire:

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

mais cela ne le rendrait pas plus facile.

Vous pouvez toujours créer une fonction

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

Puis:

doall vagrant up ssh
Stéphane Chazelas
la source
Belle approche! J'aime l'idée de pouvoir l'utiliser pour plus d'une application. Merci!
jktravis
4

Pas directement une réponse, mais deux alternatives méritent d'être examinées (trop pour un commentaire):

  1. Alias

    Si vous utilisez plusieurs fois une commande, vous pouvez mettre un alias dans votre ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Historique de la ligne de commande

    Ctrl+ Rvous permet de rechercher vos commandes précédentes. Ce sera beaucoup plus rapide que d'utiliser des variables ...

Sébastien
la source
4
 v=vagrant; $v up && $v ssh

Cela pourrait être proche de ce que vous recherchez.

Voici une fonction qui - dans bash- affichera le premier mot en position de commande pour la commande composée actuelle:

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

Avec cela, vous pourriez faire:

vagrant up && rc ssh

Un exemple:

echo up && rc ssh

PRODUCTION

up
ssh

ou...

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

PRODUCTION

+ 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
la source