fc
es el comando, incorporado en el shell bash, hecho para editar & amp; volver a ejecutar los comandos de la historia.
Es Presente en CygWin también y funciona en todas las distribuciones de Linux en las que he probado:
fc -s '\'='/' -1
Algunas explicaciones
Algunas palabras más acerca de por qué está obteniendo "sustitución fallida"
Parece que para el s
modificador no se ha implementado (todavía) la sustitución del carácter de barra invertida \
, ese es el escape. Para asegurarnos de que deberíamos ver el código, por ejemplo, de la versión gnu de la expansión del historial de bash (pero estaba el comando anterior para obtener lo que estaba intentando hacer ... así que tómalo perezoso ....).
Algunas notas:
Nos llevan a pensar que funcionará cada RegEx que encontremos trabajando con sed
, pero no está garantizado. La barra invertida es el carácter de escape de la expansión y el problema está aquí. Además, el comportamiento de la expansión está relacionado con la shopt
Opciones, por lo que deberíamos empezar a ver caso por caso ...
Cuando pegas la cadena cd C:\Foo\Bar
en su shell bash se ampliará y aparecerá para el intérprete como cd C:FooBar
; de esta forma se almacenará en el $_
variable interna también.
Si en lugar de pegar cd "C:\Foo\Bar"
o cd 'C:\Foo\Bar'
en el $_
variable que deberías encontrar C:\Foo\Bar
.
Dado que la expansión del Historial se realiza inmediatamente después de leer una línea completa, antes de que el shell la rompa en palabras, puede tener la tentación de comenzar a usarla con algunos bashismo más o menos simple, por ejemplo, con alguna derivación de (tal vez agregando :p
o :q
, ""
, analizando y así sucesivamente ...)
!!:0 ${_//\\/\/}
Este es el momento para recordar que no es seguro. para comenzar jugar con camino y nombres de archivos , especialmente si vienen del portapapeles de Windows (lea en general la página Por qué no analizar gramaticalmente ls
? , está esencialmente relacionado con la posibilidad de usar tabulaciones, espacios y nuevas líneas como caracteres correctos para los nombres de archivo y los de directorio ...).
Además cuando Pegar un texto capturado con el ratón. , también puedes pegar un espacio inicial. Esto puede evitar que su comando termine en el historial (depende de las opciones de shell ...). Si es así tu siguiente !!
será un comando no controlado ... (ver un ejemplo en otra respuesta ). Este es un riesgo tangible innecesario. .
Conclusión
Expansiones de historia introducir palabras de la lista de historial en el flujo de entrada, haciéndolo fácil para repetir comandos, inserte los argumentos de un comando anterior en la línea de entrada actual o corrija los errores en los comandos anteriores rápidamente.
Si no es fácil empiezo a pensar que estamos haciendo algo mal. ;-)
Ad nauseam: un pequeño experimento.
He habilitado histverify
en la cáscara entonces ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
entonces presiono Entrar y como verificado expansión encuentro
echo D:\Foo\Bar {1,2}A
entonces presiono Entrar de nuevo y se hace eco
D:FooBar 1A 2A
Esto parece indicar que la substitution failed
Se genera en la historia la expansión procesada antes de la Expansión de la abrazadera , asi que ante todo , y parece confirmar que la s
el modificador de historia (todavía) no procesó la sustitución del \
personaje como regex real ...
cd 'C:\foo\bar'