Como posso fazer o comando 'history' e não ter números de linha para poder copiar vários comandos de linha?

5

Às vezes, faço o comando history para ver quatro comandos seguidos.

Eu quero copiar esses comandos para que eu possa executá-los novamente.

Eu costumo selecioná-los com o mouse e shift-ctrl-c, que funciona bem, mas eu também recebo os números de linha.

Como posso fazer history e não ter números de linha?

Eu tentei a página man, mas fiquei impressionado.

    
por Michael Durrant 13.08.2012 / 15:27

5 respostas

2

Usando o awk:

history | awk '{$1="";print}'

    
por 13.08.2012 / 15:29
5

Observe que a saída do histórico pode depender do ambiente local. Na minha máquina, parece:

 $ history | tail -1
 2993  2012-08-13 17:42:17 echo "test"

e nenhuma de suas respostas funcionará ao meu lado.

Uma opção útil é fc (geralmente é integrada), que funciona perfeitamente independente das configurações locais.

fc tem -n opção que suprime números na saída. Então, seu comando ficaria assim:

fc -l -n

produz apenas os últimos comandos.

Para produzir todo o histórico neste estilo, use:

fc -l -n 1  

Para produzir sem espaços no começo, você pode usar sed para removê-los:

fc -l -n 1 | sed 's/^\s*//'
    
por 13.08.2012 / 15:45
2

Em bash :

history | tr -s ' ' | cut -d' ' -f3-

Em zsh e ksh :

history -n

Em tcsh :

history -h

Editar

Veja também a resposta de rush sobre o uso de fc .

    
por 13.08.2012 / 15:38
1

Uma solução alternativa é usar o método block select do terminal, se ele estiver disponível. Normalmente, você simplesmente segura Ctrl antes de selecionar com o mouse. Isso permitirá o modo de seleção de blocos em muitos terminais modernos (definitivamente os numerosos terminais baseados em libvte).

Em seguida, basta arrastar e soltar para que o bloco de seleção cubra todas as linhas (até a largura total do comando mais longo) que você deseja copiar. Então você simplesmente cole e as novas linhas serão preservadas.

Este é um truque simples que eu uso muitas vezes por dia ao fazer cópias / pastas rápidas, para evitar coisas como números de linha prefixados, timestamps em arquivos de log, etc.

Observe que isso não funcionará se um dos comandos copiados ocupar mais de uma linha!

    
por 14.08.2012 / 00:27
1

tl; dr: use history -p \!-{4..1}

Se a única razão pela qual você deseja copiá-los é para poder executá-los novamente, convém usar simplesmente a expansão do histórico. (Execute LESS='+/^history expansion' man bash para ver a página do manual para isso.)

Por exemplo, digamos que eu queira executar novamente os últimos quatro comandos. Eu posso apenas digitar:

!-4; !-3; !-2; !!

Se eu não tiver certeza absoluta de que foram os quatro últimos comandos e quero verificar quais eram esses comandos antes de executá-los, posso usar o modificador p para imprimir a expansão e adicioná-la ao meu histórico sem realmente executando:

!-4; !-3; !-2; !!:p

(Colocar em qualquer expansão de histórico é o suficiente; nada será executado dessa forma.)

Agora, se eu estou feliz com isso, basta pressionar a seta "para cima" e pressionar "enter".

Se eu quiser salvar um comando em um arquivo para referência futura, eu uso a opção -p no comando history . Primeiro, normalmente recebo o número do histórico do último comando, por exemplo, executando history | tail . Digamos que é assim:

$ history | tail
 1136  cd /tmp
 1137  ls 
 1138  cd -
 1139  pwd
 1140  cp somefile ~-/
 1141  ping somesite.com
 1142  printf '%*.*s\n' 0 "$(tput cols)" "$(printf '%0.1s' -{1..$(tput cols)})"
 1143  for ((i=1;i<=3;i++)); do awk -F: -vi="$i" '{if (NR != 1) {printf ":"} {printf "%s",$i}} END {printf "\n"}' input; done | column -t -s:
 1144  cd ~/documents
 1145  history | tail

Se eu quiser salvar o comando longo for loop (linha 1143) para uso posterior, posso fazê-lo facilmente usando history -p da seguinte forma:

$ history -p \!1143 >> my_list_of_one_liners.sh

Observe que history -p em si não aparece na lista do histórico.

Observe também que history -p pode aceitar vários argumentos e expandirá cada um em uma linha separada. Então realmente essa é a melhor resposta para a sua pergunta, que eu percebi agora.

Execute history -p \!-{4..1} e você verá os últimos quatro comandos que você executou impressos no seu terminal sem números anteriores, perfeitos para copiar. O 4 pode ser substituído por qualquer número que você desejar.

    
por 11.03.2016 / 07:15