No bash, você pode alias de um comando nulo para alguma coisa? Em outras palavras, reconhecer que o usuário pressionou apenas a Entertecla no prompt do shell? Por exemplo, se você deseja limpar a tela com uma entrada de shell em branco, como usar o alias Enterpara o clear
comando?
Responder1
Veja como (efetivamente) criar um alias para um comando vazio:
Coloque o seguinte em seu .bashrc
:
command1()
{
if [ "$BASH_COMMAND" != command2 ]
then
command_flag=1
fi
return 0
}
trap command1 debug
command2()
{
if [ ! "$command_flag" ]
then
echo "clear" # Put whatever command(s) you want here.
fi
command_flag=
}
PROMPT_COMMAND=command2
Se necessário, substitua command1
e command2
de forma consistente por palavras que você provavelmente não digitará aleatoriamente.
trap command1 debug
fará com que acommand1
função seja executada toda vez que você (o usuário) digitar um comando.- Se o comando mais recente a ser executado não foi
command2
,command1
será definidocommand_flag
.
- Se o comando mais recente a ser executado não foi
- Atribuir
command2
aPROMPT_COMMAND
fará com quecommand2
seja executado sempre que o shell estiver prestes a emitir um prompt.- Se
command_flag
tiver um valor que não esteja em branco, significa quecommand1
acabou de ser executado, o que significa que o usuário acabou de executar um comando. Neste caso, não faça nada. - Se
command_flag
isso acontecernãotem um valor que não está em branco, isso significa que o usuário acabou de clicar Enter. Neste caso, faça o que deseja (por exemplo, limpar a tela). - Em ambos os casos, deixe
command_flag
em branco, para que tudo funcione no próximo ciclo.
- Se
Nota: tenho certeza de que isso é específico do bash (ou seja, não é compatível com POSIX).
Esta resposta foi basicamente copiada da minha resposta paraAdicionando espaço vertical após comando no bash. Veja tambémdiga se o último comando estava vazio em PROMPT_COMMAND para outras abordagens.
Responder2
TL;DR: Ctrl-l
limpará a tela sem imprimir um caractere ou pressionar enter. Este é provavelmente o mais próximo que você chegará da funcionalidade desejada. Você pode executar um comando antes ou depois de cada comando ou pode criar um alias para um único caractere. Você não pode criar um alias para a string vazia.
Os aliases não são necessariamente projetados para serem tudo inserido em uma linha.
alias ll='ls -l'
é um bom exemplo disso. Você pode fazer ll /path/to/other/dir
e obter resultados.
Tudo o que um alias faz é literalmente alterar a(s) primeira(s) palavra(s) digitada(s) na linha de comando para o valor que você deu a ele
O único requisito para que um alias funcione é que ele seja seguido de um caractere não imprimível (espaço/tabulação/nova linha). No nosso caso, ll
por si só é válido, mas ll-/mypath/
não é, porque é possível (e frequentemente feito) criar um alias para alguns caracteres que podem ser o início de outro comando (ou seja, alias gi='git init'
só pode resolver exatamente gi
, não git
, que é o que mais as pessoas querem e esperam).
Não é possível criar um alias para uma string vazia, pois isso seria no início detodoentrada de linha de comando.
Se você deseja que um comando seja executado sempre, você pode usar PS0
(assumindo uma versão recente do bash) para executar algo antes de cada comando ou PROMPT_COMMAND
para executar algo após cada comando. Por exemplo:
PROMPT_COMMAND='echo $?'
ecoaria o valor de retorno do comando que você executou após cada comando executado.
O Bash não tem uma boa maneira de concluir uma ação se, e somente se, você inseriu uma linha vazia na linha de comando. Bash não é sensível a espaços em branco dessa forma.