2008-10-14 5 views
4

J'ai deux scripts qui doivent souvent être exécuté avec le même paramètre:Comment est-ce que je réutilise une commande dans bash avec différents paramètres?

$ populate.ksh 9241 && check.ksh 9241 

Quand je dois changer le paramètre (dans cet exemple), je peux revenir en arrière et modifier la ligne dans l'histoire . Mais puisque j'ai besoin de changer le numéro à deux endroits, je fais parfois une faute de frappe. J'aimerais pouvoir changer le paramètre une seule fois pour le changer aux deux endroits.

r=$1 
populate.ksh $r && check.ksh $r 

Ou pour plusieurs paramètres::

for r; do 
    populate.ksh $r && check.ksh $r 
done 

Pour les tâches

Répondre

10

En bash:

!!:gs/9241/9243/ 

Oui, il utilise gs///, et non s///g. :-)

(réponse de Zigdon utilise la dernière commande commençant par pop, comme populate.sh. Ma réponse utilise la dernière commande, point final. Choisissez qui vous convient.)

+0

Je ne sais pas si c'est vrai, mais cette fonctionnalité semble utiliser plus de frappes que juste éditer la ligne de commande. J'étais amoureux de la notation bang pour rappeler l'histoire, mais pour une raison quelconque, je ne l'utilise plus. J'espère que votre réponse aidera les autres, cependant. ;-) –

+0

Pensez à une commande complexe avec beaucoup d'opérateurs logiques et des tuyaux, celui-ci sera un épargnant de vie :) – hayalci

+0

Le 'g' ne fonctionne pas pour moi. Il remplace seulement la première occurrence de 9241.Existe-t-il une option de configuration dans bash qui doit être définie? – finnw

1

qui appelle les scripts à son tour une solution consiste à créer simplement un script d'emballage (populate_check.ksh) plus transitoire, vous pouvez également paramétrer la commande afin qu'elle soit plus facile à éditer dans l'historique:

$ r=9241; populate.ksh $r && check.ksh $r 

Ou faire plusieurs à la fois:

$ for r in 9241 9242; do populate.ksh $r && check.ksh $r; done 
+0

Ne dites pas "pour r en $ *"; préfère dire "pour r" à la place. Ce dernier vous permet de spécifier des arguments avec des espaces ou d'autres caractères IFS. –

+0

Pour les lurkers et les archives: 'for r' est équivalent à' for r in "$ @" ', pour ceux qui ont la malchance d'utiliser un shell ne supportant pas la forme plus courte. –

+0

Excellent! Encore une fois, poster des questions Je sais que la réponse est payante. Merci. –

5

Vous pouvez également utiliser la fonction de substitution de l'histoire:

!pop:gs/9241/1234 

comme ceci:

$ populate.ksh 9241 && check.ksh 9241 
... 
$ !pop:gs/9241/1234 
populate.ksh 1234 && check.ksh 1234 
... 
1

réponses correctes ont déjà été données, mais pour une compréhension plus générale lire la page de manuel avec une attention particulière à "Expansion de l'historique" et les variables de shell associées (telles que "HISTCONTROL", "histchars", etc.). BTW-- La fonction de recherche de votre téléavertisseur est très utile lors de la lecture man bash

Questions connexes