Acesso ao último comando em Zsh (não a linha de comando anterior)

8
Hibou57 2014-08-13 20:07.

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.

O que foi tentado

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.

O que precisa ser alcançado

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.

2 answers

5
Noname 2014-08-14 16:50.

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 !!, !!:1e 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, varna 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 $varimprima echo This is command #1conforme 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 echoe 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.

5
Hibou57 2014-08-14 06:17.

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 $historymatriz 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 -n1no Bash e eu posso aplicar sedisso. 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.

MORE COOL STUFF

Cate Blanchett dormiu com o marido depois de 3 dias juntos e ainda está casada com ele 25 anos depois

Cate Blanchett dormiu com o marido depois de 3 dias juntos e ainda está casada com ele 25 anos depois

Cate Blanchett desafiou os conselhos típicos de namoro quando conheceu o marido.

Por que Michael Sheen é um ator sem fins lucrativos

Por que Michael Sheen é um ator sem fins lucrativos

Michael Sheen é um ator sem fins lucrativos, mas o que exatamente isso significa?

Hallmark Star Colin Egglesfield Pratos Emocionantes Encontros de Fãs no RomaDrama Live! [Exclusivo]

Hallmark Star Colin Egglesfield Pratos Emocionantes Encontros de Fãs no RomaDrama Live! [Exclusivo]

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.

Por que você não pode transmitir 'Exposição do Norte' online

Por que você não pode transmitir 'Exposição do Norte' online

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.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

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!

Como a matéria branca ajuda a função da matéria cinzenta do cérebro

Como a matéria branca ajuda a função da matéria cinzenta do cérebro

Todos nós já ouvimos falar da massa cinzenta do cérebro, mas e a massa branca? O que isso faz?

Doe seu cabelo para ajudar a manter nossa água limpa

Doe seu cabelo para ajudar a manter nossa água limpa

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.

Um olhar sobre os casamentos mais memoráveis ​​da Casa Branca

Um olhar sobre os casamentos mais memoráveis ​​da Casa Branca

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á?

O primeiro trailer da 10ª temporada de The Walking Dead tem grandes momentos Michonne e uma viagem para a praia

O primeiro trailer da 10ª temporada de The Walking Dead tem grandes momentos Michonne e uma viagem para a praia

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.

O que as cenas pós-crédito de Homem-Aranha: Longe de Casa significam para o futuro da fase 4

O que as cenas pós-crédito de Homem-Aranha: Longe de Casa significam para o futuro da fase 4

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.

Ninguém sabe realmente quantos homens têm disfunção erétil

Ninguém sabe realmente quantos homens têm disfunção erétil

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%.

Aqui estão algumas fotos de celebridades curtindo o dia do cachorro-quente

Aqui estão algumas fotos de celebridades curtindo o dia do cachorro-quente

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 Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Carne de porco Mapo de Dawn Burrell e homus de Edamame

Carne de porco Mapo de Dawn Burrell e homus de Edamame

"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 à beira da água em Londres, além de Jennifer Lopez, Julianne Hough e mais

Kate Middleton passa um dia à beira da água em Londres, além de Jennifer Lopez, Julianne Hough e mais

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!

Jovem de 17 anos esfaqueado até a morte enquanto outros 4 ficaram feridos em um ataque de faca no rio Wisconsin

Jovem de 17 anos esfaqueado até a morte enquanto outros 4 ficaram feridos em um ataque de faca no rio Wisconsin

Investigadores estão investigando se o grupo e o suspeito se conheciam antes do ataque

Imagine criar uma estratégia de conteúdo que realmente CONVERTE. É possível.

Imagine criar uma estratégia de conteúdo que realmente CONVERTE. É possível.

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.

Uma perda gigantesca abriu meu coração para o amor

Uma perda gigantesca abriu meu coração para o amor

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.

Quando você não pode ser a pessoa que a internet quer que você seja

Quando você não pode ser a pessoa que a internet quer que você seja

Odeio a palavra “naufrágio”. As pessoas se confortam em sua própria bússola moral e, ao fazê-lo, encontram-se julgando.

A visão de nuvem descentralizada do DFINITY Blockchain

Nota do Editor: Você está visualizando material desatualizado do blog DFINITY que está sendo preservado para fins de arquivamento.

A visão de nuvem descentralizada do DFINITY Blockchain

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 .

Language