Como definir um alias em todas as shells tty?

5

Eu configurei um alias no shell tt2, mas ele não funcionará em outros tty shells, alguma idéia de como criar um alias para o sistema?

    
por ChiseledAbs 23.07.2016 / 14:50

2 respostas

3

Você não pode forçar um processo do shell a usar novos aliases do lado de fora, portanto, o pedido para carregar os novos aliases terá que vir de cada instância do shell em cada terminal.

Você pode fazer o bash executar código após cada comando colocando esse código no PROMPT_COMMAND variável. Então você poderia usar algo como

reload_aliases () {
  . ~/.bash_aliases
}
PROMPT_COMMAND="$PROMPT_COMMAND
reload_aliases"

e defina seus aliases editando ~/.bash_aliases em vez de digitá-los em um shell. Observe que a variável PROMPT_COMMAND é executada apenas depois de executar um comando, portanto, é necessário executar um comando (por exemplo, : , que é um comando que não faz nada); uma linha de comando vazia não é suficiente.

Você também pode substituir o comando alias para anexar automaticamente ao arquivo .bash_aliases , mas eu recomendo contra isso, porque seria muito prejudicial quando você quiser definir um alias específico da tarefa para apenas um shell. Você pode anexar um alias específico com sua definição no shell atual com o comando alias ALIASNAME >>~/.bash_aliases (substituir ALIASNAME pelo nome real do alias).

No zsh, você deve usar precmd em vez de PROMPT_COMMAND do bash . Ao contrário do bash PROMPT_COMMAND , precmd é realmente executado antes de exibir cada prompt, então pressionar Enter no prompt é o suficiente para invocá-lo. Mesmo o zsh não tem como recarregar o arquivo de alias sem intervenção do usuário.

Como alternativa, você pode fazer com que seu shell reaja a um sinal definindo um trap . O sinal SIGUSR1 não é usado por shells, então você pode usar isso para fazer com que ele carregue seus aliases:

trap 'reload_aliases' USR1

(A função reload_aliases é como acima.) Com essa abordagem, você precisa enviar um sinal SIGUSR1 para todas as instâncias interativas de seu shell ao editar sua lista de aliases. Certifique-se de não enviar o sinal para os scripts, porque a ação padrão para este sinal é matar o shell! Não há uma maneira fácil de listar shells interativos; o seguinte script específico do Linux chega perto, mas esteja ciente de que ele pode fechar acidentalmente um processo não relacionado por causa das condições de corrida.

for pid in $(pgrep bash); do
  if cd "/proc/$pid" 2>/dev/null &&
     [ -c fd/0 ] &&
     grep '^SigCgt: .............[2367abef]..$' status; then
    kill -USR1 "$pid"
  fi
done
    
por 23.07.2016 / 15:45
4

NENHUMA necessidade de trabalhos pesados, basta alterar o arquivo /etc/bashrc . Eu sei, você pode pensar que isso só funciona na corrente tty mas não mate, funciona. Basta sair uma vez e depois entrar novamente com qualquer usuário que você gosta. Você pode até testar isso por meio de SSHing ou qualquer outra coisa.

Mas se não funcionar - embora eu acredite - leia este arquivo, isso pode ajudar muito: /etc/profile

    
por 23.07.2016 / 16:17

Tags