Réponse courte: la fonction intégrée fc
(commande fix) de bash
fc
est la commande, intégrée au shell bash, conçue pour éditer et réexécuter les commandes de l'historique.
Il est également présent sur CygWin et fonctionne sur toutes les distributions Linux sur lesquelles j'ai testé:
fc -s '\'='/' -1
Quelques explications
Quelques mots de plus sur les raisons de l'échec de la substitution
Il semble que pour le s
modificateur ne soit pas (encore) implémenté la substitution du caractère barre oblique inverse \
, c'est le caractère d'échappement. Pour être sûr, nous devrions voir le code, par exemple, de la version gnu de l'expansion de l'historique bash (mais il y avait la commande ci-dessus pour obtenir ce que vous essayez de faire ... alors je le prends paresseux ....).
Quelques notes:
Nous sommes amenés à penser que cela fonctionnera avec chaque RegEx avec lequel nous travaillons sed
, mais ce n'est pas garanti. La barre oblique inverse est le caractère d'échappement de l'extension et le problème est là. De plus le comportement de l'expansion est lié aux shopt
options, il faut donc commencer à voir au cas par cas ...
Lorsque vous collez la chaîne cd C:\Foo\Bar
dans votre shell bash, elle sera développée et apparaîtra pour l'interpréteur comme cd C:FooBar
; sous cette forme, il sera également stocké dans la $_
variable interne.
Si vous avez plutôt collé cd "C:\Foo\Bar"
ou cd 'C:\Foo\Bar'
dans la $_
variable, vous devriez trouver C:\Foo\Bar
.
Étant donné que l'expansion de l'historique est effectuée immédiatement après la lecture d'une ligne complète, avant que le shell ne la décompose en mots, vous pouvez être tenté de commencer à l'utiliser avec un bashisme plus ou moins simple, par exemple, avec une dérivation de (peut-être en ajoutant :p
ou :q
, ""
, l'analyse et ainsi de suite ...)
!!:0 ${_//\\/\/}
C'est le moment de se rappeler qu'il n'est pas sûr de commencer à jouer avec les chemins et les noms de fichiers , surtout s'ils proviennent du presse-papiers de Windows (lire en général la page Pourquoi ne pas analyser ls
?, C'est essentiellement lié à la possibilité d'utiliser tab, espaces et sauts de ligne comme caractères corrects pour les noms de fichiers et de répertoires ...).
De plus, lorsque vous collez un texte capturé avec la souris , vous pouvez également coller un espace de tête. Cela peut éviter que votre commande se termine dans l'historique (cela dépend des options du shell ...). Si c'est le cas, votre commande suivante !!
sera une commande non contrôlée ... (voir un exemple dans une autre réponse ).Il s'agit d'un risque tangible inutile .
Conclusion
Les extensions d'historique introduisent des mots de la liste d'historique dans le flux d'entrée, ce qui facilite la répétition des commandes, l'insertion des arguments d'une commande précédente dans la ligne d'entrée actuelle ou la correction rapide des erreurs dans les commandes précédentes.
Si ce n'est pas facile, je commence à penser que nous faisons quelque chose de mal ;-)
Ad nauseam: une petite expérience
J'ai activé histverify
dans le shell alors ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
puis j'appuie Enteret comme expansion vérifiée je trouve
echo D:\Foo\Bar {1,2}A
puis j'appuie à Enternouveau et ça fait écho
D:FooBar 1A 2A
Cela semble indiquer que le substitution failed
est généré dans l'expansion de l'histoire traitée avant l' expansion de Brace , donc tout d'abord , et cela semble confirmer que le s
modificateur de l' histoire n'a pas (encore) traité la substitution du \
personnage comme une véritable expression régulière. ..
cd 'C:\foo\bar'