Existe uma maneira de recuperar o texto do último comando em Zsh? Quero dizer o último comando executado, não a última linha de comando.
Tentando fazer isso, descobri uma diferença sutil entre o manejo da história por Zsh e Bash. Essa diferença é exposta no exemplo a seguir, que é a base do que eu estava fazendo no Bash e que não funciona no Zsh.
$ zsh $ echo "This is command #1"
> This is command #1
$ echo "This is command #2"; echo $(history | tail -n1)
> This is command #2
> 3807 echo "This is command #1"
$ bash $ echo "This is command #1"
> This is command #1
$ echo "This is command #2"; echo $(history | tail -n1)
> This is command #2
> 4970 echo "This is command #2"; echo $(history | tail -n1)
Mesmos testes, cujo resultado difere na última linha. Bash anexa a linha de comando ao histórico, antes da execução (não sei se é por especificação), enquanto Zsh parece anexar a linha de comando ao histórico, após a execução (o mesmo, não sei se é por especificação ), portanto history | tail -n1
, não dá o mesmo.
O que eu quero, é poder recuperar echo "This is command #2"
, ou seja, o texto do comando anterior mesmo quando está na mesma linha de comando de outros comandos (quando existem vários comandos separados por ;
).
Com o bash, eu poderia usar history | tail -n1 | sed ...
, mas isso não funciona mais com o Zsh, devido a diferença no tratamento do histórico.
Alguma ideia de como obter o último comando de uma linha de comandos múltiplos no Zsh?
Eu preciso dele para quando um comando precisar saber qual era o comando anterior, seja qual for o comando que estava na mesma linha ou na linha anterior. Outra forma de dizer isso, poderia ser: Eu preciso acessar o último item de um único histórico de orientação de comando, não de um histórico de linha de comando.
Até onde eu sei, não existe uma maneira fácil de fazer isso no zsh. Acredito que a resposta mais próxima à sua pergunta no shell interativo é usar o mecanismo de expansão de histórico, especialmente !#
, mas você pode estar interessado em !!
, !!:1
e em outros também. Do manual zsh:
! # Consulte a linha de comando atual digitada até agora.
Portanto, você pode fazer o seguinte para obter o comando anterior:
echo "This is command #1"; var=$(echo !#) && echo "The previous command was:" \'$var\'
E o resultado é
This is command #1
The previous command was: 'echo This is command #1'
Você também pode brincar com
echo "This is command 1"; var=$(echo "!#:s/;//") && echo "The previous command was:" \'$var\'
se você precisaria colocar !#
entre aspas duplas, mas neste caso você deve remover ;
do final do "último comando". :s/;//
está fazendo isso. Comandos mais sofisticados agora estão funcionando bem:
ls >/dev/null 2>&1; var=$(echo "!#:s/;//") && print "The previous command was:" \'$var\'
dá a saída:
ls >/dev/null 2>&1; var=$(echo "ls >/dev/null 2>&1") && print "The previous command was:" $var
The previous command was: 'ls >/dev/null 2>&1'
Observe, entretanto, que neste caso #
não deve estar presente no primeiro comando junto com as aspas, pois será interpretado como um comentário.
Nota 1
É importante aqui que !#
representa tudo o que está presente na linha atual até agora, exceto um átomo atual, portanto, var
na expressão
echo "This is command #1"; var=$(echo !#) && echo "The previous command was:" \'$var\'
é na verdade igual a:
var=$(echo echo "This is command #1";)
para que echo $var
imprima echo This is command #1
conforme mencionado antes. Mas se escrevermos uma versão simplificada, sem variável:
echo "This is command #1"; echo "The previous command was:" !#
então !#
conteria adicional, segundo echo
e seu argumento, então, na verdade, o comando se tornaria:
echo "Este é o comando # 1"; echo "O comando anterior era:" echo "Este é o comando # 1"; echo "O comando anterior era:"
Nota 2
Esta solução obviamente não é perfeita porque, como você pode notar, as cotações não são incluídas nas variáveis. Você pode tentar contornar isso acrescentando aspas simples, !#
mas não diretamente (caso contrário, a expansão do histórico não funcionará).
Nota 3
Se você tiver mais de 3 ou mais comandos em uma linha, separados por ;
, do que você precisaria brincar um pouco mais com os modificadores zsh ou com comandos externos como sed ou awk.
Uma tentativa de responder à minha própria pergunta. Ainda dou boas-vindas às respostas dos outros, pois esta não é perfeita.
Pelo menos, há uma maneira de obter o mesmo que no Bash, usando a $history
matriz e o $HISTCMD
índice. Exemplo:
$ zsh $ echo "This is command #3"; echo $history[$HISTCMD]
> This is command #3
> echo "This is command #3"; echo $history[$HISTCMD]
Isso retorna o mesmo que history | tail -n1
no Bash e eu posso aplicar sed
isso. Mas confiar sed
é precisamente a razão pela qual essa resposta não é totalmente perfeita; é propenso a erros analisar uma linha de comando com expressões regulares, especialmente com uma sintaxe de shell tão complexa quanto a de Zsh.
Cate Blanchett desafiou os conselhos típicos de namoro quando conheceu o marido.
Michael Sheen é um ator sem fins lucrativos, mas o que exatamente isso significa?
A estrela da Hallmark Colin Egglesfield falou sobre emocionantes encontros com fãs no RomaDrama Live! além de seu programa INSPIRE na convenção.
Você terá que tirar o pó de um Blu-ray ou DVD player para ver por que Northern Exposure se tornou um dos programas mais populares dos anos 90.
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
Todos nós já ouvimos falar da massa cinzenta do cérebro, mas e a massa branca? O que isso faz?
Aparas de cabelo de salões e doações pessoais podem ser reaproveitadas como tapetes que absorvem derramamentos de óleo e ajudam a proteger o meio ambiente.
Apenas algumas pessoas se casaram na Casa Branca nos últimos 200 anos. Quem eram eles e o que é necessário para marcar um casamento lá?
A 10ª temporada de The Walking Dead começa em 6 de outubro e, assim como nos anos anteriores, a equipe por trás do show deixou seu primeiro trailer dentro do Hall H na San Diego Comic-Con. A 10ª temporada parece muito um novo show, com novidades personagens, personagens antigos, novos visuais para personagens antigos, pelo menos um barco e algumas surpresas muito grandes.
Homem-Aranha: Longe de Casa é um filme muito maior do que parece enquanto você o assiste. Na verdade, a Marvel confirmou que este filme, e não Avengers: Endgame, marca o fim da fase 3 de seu universo cinematográfico.
Quantos homens estão lutando contra a disfunção erétil? Bem, de acordo com uma revisão recente da literatura médica, depende de como e onde você faz a pergunta. As taxas globais de disfunção erétil, ele descobriu, variam de apenas 3% dos homens a 76%.
O dia seguinte a 3 de julho é um período de 24 horas durante o qual a América se sente acendendo pólvora enquanto come deliciosas toras de terra grelhadas, restos de carne processada ao lado de tubérculos cobertos de maionese. As celebridades não estão acima da participação no Dia do Cachorro-quente e, para nossa sorte, elas também não estão acima do Instagram em seus esforços patrióticos.
Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!
"Esta é uma indústria dominada por homens, e estou feliz por ser uma das pessoas que quebrou o molde para ajudar as mulheres de cor", diz Top Chef: finalista de Portland e chef-parceiro do final de agosto em Houston. "Muitas vezes somos ignorados e às vezes não ensinados, mas isso vai mudar."
Kate Middleton passa um dia na água em Londres, além de Jennifer Lopez, Julianne Hough e muito mais. De Hollywood a Nova York e em todos os lugares, veja o que suas estrelas favoritas estão fazendo!
Investigadores estão investigando se o grupo e o suspeito se conheciam antes do ataque
Em 2021, encorajo você a repensar tudo o que sabe sobre os clientes que atende e as histórias que conta a eles. Dê um passo para trás.
No dia do aniversário de 9 anos de Felix The Cat, lembro-me de uma das maiores perdas da minha vida adulta – minha Sophie em 2013. Escrevi este ensaio e o compartilhei brevemente nesta plataforma em 2013.
Odeio a palavra “naufrágio”. As pessoas se confortam em sua própria bússola moral e, ao fazê-lo, encontram-se julgando.
Este post explora a visão de nuvem descentralizada da equipe DFINITY e como ela se relaciona com o blockchain tradicional e os provedores de nuvem existentes, como Amazon Web Services. Demonstrações da tecnologia DFINITY aplicada por uma rede de larga escala serão feitas no outono de 2017, seguidas por uma arrecadação de fundos principal para a fundação sem fins lucrativos de apoio, com a rede “nuvem aberta” prevista para ser lançada no início do verão de 2018 .