Puis-je utiliser '!!' dans des alias ou des scripts?

10

Dans le terminal, je peux utiliser !!qui référencera ma commande précédente.
Est-il possible de l'utiliser dans un alias? Je l'ai essayé, mais ce qui se passe, c'est que les points d'exclamation doubles sont interprétés littéralement.

Ce que je veux avoir, c'est:

  1. J'entre une commande
  2. Je tape un alias qui inclura ce qui a été entré à l'étape 1

S'il existe une solution utilisant des scripts, elle est également acceptable.

Ludwig Magnusson
la source
quel est votre objectif principal? ajouter plus d'options à la dernière commande?
Sergiy Kolodyazhnyy
Non, mon objectif est de taper rapidement une commande longue que j'utilise souvent. Au milieu, il y a une longue chaîne qui est souvent la commande précédente
Ludwig Magnusson
il semble que vous souhaitiez simplement fccommander, ce qui ouvre un éditeur de texte, car c'est le moyen le plus simple de modifier de longues commandes. Permettez-moi de l'ajouter à mon message. Aussi, peut-être pourriez-vous fournir un exemple de commande?
Sergiy Kolodyazhnyy
Ajout d'une modification à mon message
Sergiy Kolodyazhnyy

Réponses:

11

La commande qui répertorie la dernière commande exécutée est fc -nl -1. En utilisant la substitution de sortie, nous pouvons ajouter plus de paramètres au même contenu

$> ls /etc/passwd
/etc/passwd
$> $(fc -nl -1)  /etc/group                                                     
/etc/group  /etc/passwd
$> 

Citer, cependant, peut être un problème avec cette approche

Une fonctionnalité très intéressante fcest que si vous exécutez la fccommande seule, elle ouvrira l'éditeur de texte spécifié dans la FCEDITvariable (dans laquelle vous souhaitez probablement le stocker ~/.bashrc) et le contenu de la ligne sera votre dernière commande. Pour votre facilité, je vous suggère de l'utiliser nanocomme éditeur de texte, mais si vous le savez vim - encore mieux.

Par exemple, que faire si je dois modifier qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.ActiveWindow une ligne énorme, non? Mais avec fc, je peux ouvrir vimet éditer /org/ayatana/bamf/matcher, enregistrer, quitter et ça fonctionnera.

Sergiy Kolodyazhnyy
la source
9

Vous ne pouvez pas utiliser !!mais ...

Du manuel :

Un alias utile à utiliser avec la commande fc est r='fc -s', de sorte que taper «r cc» exécute la dernière commande commençant par cc et taper «r» réexécute la dernière commande.

Rinzwind
la source
Cela me permettra donc d'ajouter quelque chose au début de ma dernière commande. Et au milieu?
Ludwig Magnusson
8

Si vous insistez pour utiliser la !!syntaxe d'extension d'historique au lieu de fc(mentionnée déjà), il existe un moyen.

Par défaut, history expansion est désactivée pour les sessions shell non interactives, par exemple dans les scripts.

Pour activer l'expansion de l'historique dans les scripts, activez d'abord les options de shell pertinentes:

set -o history 
set -o histexpand

set -o histexpand peut s'écrire set -H .

Maintenant, les opérations d'extension de l'historique fonctionneraient par exemple !!à l'intérieur du script.

heemayl
la source