fc
é o comando, incorporado no shell bash, criado para editar e reexecutar comandos do histórico.
Também está presente no CygWin e funciona em todas as distribuições Linux nas quais testei:
fc -s '\'='/' -1
Algumas explicações
fc
é a festa built-in comando à lista ou editar e re-executar comandos a partir da lista do histórico.
-1
assumirá o último comando da história. Observe que even !!
é definido (lido de man bash
) como
!! Refer to the previous command. This is a synonym for
! -1 '.
-s
para substituir um padrão por outro. Desta vez, a partir de help fc
(comando incorporado help
):
Com o formato `fc -s [pat = rep ...] [comando] ', o COMMAND é reexecutado após a substituição OLD = NEW.
Ok, eles querem dizer em pat=rep
vez de OLD=NEW
...
- Os padrões serão lidos pelo shell, então temos que protegê-los com aspas:
'\'
e '/'
.
Algumas palavras mais sobre por que você está recebendo "falha na substituição"
Parece que para o s
modificador ainda não está implementada a substituição do caractere de barra invertida \
, que é o escape. Para ter certeza de que deveríamos ver o código, por exemplo, da versão gnu da expansão do bash history (mas havia o comando acima para obter o que você estava tentando fazer ... então eu tomo preguiçoso ....).
Algumas notas:
Somos levados a pensar que ele funcionará com cada RegEx que encontramos trabalhando sed
, mas não é garantido. A barra invertida é o caractere de escape da expansão e o problema está aqui. Além disso, o comportamento da expansão está relacionado às shopt
opções, portanto, devemos começar a ver caso a caso ...
Quando você cola a string cd C:\Foo\Bar
no shell bash, ela será expandida e aparecerá para o intérprete como cd C:FooBar
; neste formulário, ele também será armazenado na $_
variável interna.
Se você colou cd "C:\Foo\Bar"
ou cd 'C:\Foo\Bar'
na $_
variável você deve encontrar C:\Foo\Bar
.
Como a expansão History é executada imediatamente após a leitura de uma linha completa, antes que o shell a divida em palavras, você pode ficar tentado a usá-la com algum basismo mais ou menos claro, por exemplo, com alguma derivação de (talvez adicionar :p
ou :q
, ""
, análise e assim por diante ...)
!!:0 ${_//\\/\/}
É o momento de lembrar que não é seguro começar a brincar com nomes de arquivos e caminhos , principalmente se eles vierem da área de transferência do Windows (leia em geral a página Por que não analisar ls
?) , Está essencialmente relacionado à possibilidade de usar a guia, espaços e novas linhas como caracteres corretos para os nomes dos arquivos e dos diretórios ...).
Além disso, quando você cola um texto capturado com o mouse , também pode colar um espaço à esquerda. Isso pode evitar que o seu comando termine no histórico (depende das opções do shell ...). Nesse caso, seu !!
comando a seguir não será controlado ... (veja um exemplo em outra resposta ).Esse é um risco tangível desnecessário .
Conclusão
As expansões do histórico introduzem palavras da lista do histórico no fluxo de entrada, facilitando a repetição de comandos, a inserção de argumentos em um comando anterior na linha de entrada atual ou a correção rápida de erros nos comandos anteriores.
Se não é fácil, começo a pensar que estamos fazendo algo errado ;-)
Ad nauseam: um pequeno experimento
Eu ativei histverify
no shell então ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
então eu pressiono Entere como expansão verificada eu acho
echo D:\Foo\Bar {1,2}A
então eu pressiono Enternovamente e ecoa
D:FooBar 1A 2A
Isso parece indicar que isso substitution failed
é gerado na expansão do histórico processada antes da expansão do Brace , então, primeiro de tudo , e parece confirmar que o s
modificador do histórico (ainda) não processou (ainda) a substituição do \
personagem como um regex real. ..
cd 'C:\foo\bar'