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?


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


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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.