Como acessar a história em tempo real no Unix?


12

Por exemplo, se eu fizer uma

mkdir thisismyfolder912

Lembro que há uma maneira mais fácil de mudar do thisismyfolder912que ter que fazer uma

cd thisismyfolder912

O que é assim e como funciona? Além disso, quais são as outras maneiras pelas quais posso usar isso?


1
Use a conclusão de TAB para comandos e diretórios que não estão na sua lista de histórico recente. cd this<TAB>
Invert

Respostas:


10

Você está falando sobre expansão clássica da história ou processamento da Readline? cd !$na próxima linha de entrada o substituirá no último argumento da linha anterior M-.ou M-_o puxará usando o Readline.



Eu estava procurando cd !$. "A expansão da história do clássico ou processamento Readline" Eu não entendo exatamente o que você quer dizer ...
Lazer

2
@Lazer !$é uma expansão da história ; o shell o processa conforme analisa seu comando. M-. é um pressionamento de tecla readline; readline é a biblioteca que lida com cada tecla que você pressiona e vê que você pressionou M-. e digita o último argumento do último comando para você automaticamente
Michael Mrozek

9

Se sua pergunta é sobre como acessar o histórico de comandos, tente este comando bem nomeado

history 

Você também pode tentar Ctrl+ re começar a digitar um comando que está tentando lembrar que digitou recentemente.

(reverse-i-search)`cd ': cd mydir/data/

Pressione ESCpara selecionar o comando ou sair. Isso funciona para mim no SuSE, pelo menos; não tenho certeza sobre outras distros.


4
UAU! Isso realmente vai mudar minha vida. Dane-se history | grep ...!
Oli

Este não é apenas relacionado com o SuSE, eu acho que é uma característica Bash :)
sakisk

Acabei de ler sobre o uso vipara gerenciar sua linha de comando. Parece super legal. usando vi a comandos shell editar
Banjer


2

isto sempre funcionou para mim:

mkdir thisismyfolder
cd $_

Cuidado, porém: $!expande-se para a última palavra digitada, $_expande-se para a última palavra após a expansão - para que você possa echo /tmp/tmpfile*ver um monte de arquivos que deseja remover, mas rm $_só removerá um deles.
jmb

1

Pegando uma dica de outro segmento, se você colocar:

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

no seu .bashrc, você pode começar a digitar algo do seu histórico, pressionar a seta para cima e, em vez de passar pelo item do histórico por item, ele passará para as entradas anteriores que começam com o que você já digitado.

Acho que isso não ajuda muito com o exemplo específico dado na pergunta, mas é uma coisa que me ajuda a acessar o histórico em tempo real.


1

Se você usar o bash, sugiro pushde popd. Você pode criar uma pilha de diretórios e navegar rapidamente. Veja este exemplo:

PWD:~$ pushd /opt/google/chrome/resources/
/opt/google/chrome/resources ~
PWD:/opt/google/chrome/resources$ pushd /etc/cron.daily/
/etc/cron.daily /opt/google/chrome/resources ~
PWD:/etc/cron.daily$ pushd /opt/pac/lib/method/
/opt/pac/lib/method /etc/cron.daily /opt/google/chrome/resources ~
PWD:/opt/pac/lib/method$ popd
/etc/cron.daily /opt/google/chrome/resources ~
PWD:/etc/cron.daily$ popd
/opt/google/chrome/resources ~
PWD:/opt/google/chrome/resources$ popd
~
PWD:~$

Se você usar um prompt abreviado, as postagens serão mais legíveis. (Estou me referindo à remoção do nome do usuário e do host. Entendo que mostrar o PWD em vez de apenas $é útil na demonstração pushd, etc.)
Pausado até novo aviso.

1

Em uma nota relacionada, recomendo usar o histverify no bash. Coloque isso no seu ~ / .bashrc:

shopt -s histverify

Isso fará com que o bash imprima o comando depois de expandir! $ Ou outras funções do histórico, e lhe dê uma chance de vê-lo antes de pressionar Enter novamente para executá-lo. Para mim, a verificação de sanidade vale o pressionamento de tecla extra ocasional. Deseja ter certeza de que estou executando o cd foocomando, não o rm -rf foo...

Eu frequentemente uso a Ctrl-Rabordagem, bem como Alt-.(o que é um bom ajuste para o cenário que você descreve). Vou usar! $ De vez em quando.

Estas são técnicas de uso geral muito úteis.

Mas, para abordar sua pergunta específica:

Criar um diretório e fazer o CD diretamente nele é uma combinação tão comum que é útil ter uma função para agrupá-lo.

function mcd {
  local newdir='_mcd_command_failed_'
  if [ -d "$1" ]; then   # Dir exists, mention that
    echo "$1 exists..."
    newdir="$1"
  else
    if [ -n "$2" ]; then   # We've specified a mode
        command mkdir -p -m $2 "$1" && newdir = "$1"
    else                   # Plain old mkdir
        command mkdir -p "$1" && newdir="$1"
    fi
  fi
  builtin cd "$newdir"   # No matter what, cd into it
}

Uso: mcd thisismyfolder


1

Se seu shell usa readline (qual é o caso bash), você pode fazer algo como pressionar ATL+ .juntos?

Na documentação do GNU Readline :

yank-last-arg (M-. ou M-_)

Insira o último argumento no comando anterior (a última palavra da entrada do histórico anterior). Com um argumento, comporte-se exatamente como yank-nth-arg. Chamadas sucessivas para yank-last-arg retornam pela lista de histórico, inserindo o último argumento de cada linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.