Crie um apelido para substituir uma string sem $ VARIABLE, no bash cli

3

É possível criar apelidos para as strings usadas com frequência, sem usar o '$' na frente das variáveis $?

A string pode ser corrigida e não precisa mudar durante a vida útil do prompt do shell.

Eu sei que existem variáveis $ bash, mas estou procurando uma solução sem usar o '$' na frente de uma variável $, então é mais rápido digitar.

Eu sei que existem aliases para encurtar o comando inteiro, mas eu não quero encurtar um comando, eu quero encurtar apenas parte de um comando.

Por exemplo, quero substituir isso:

$ ssh remote_server_1
$ scp remote_server_1
$ my_script.sh remote_server_1

$ ssh remote_server_2
$ scp remote_server_2
$ my_script.sh remote_server_2

com isso:

$ aliasthingy r1="remote_server_1"
$ aliasthingy r2="remote_server_2"

$ ssh r1
$ scp r1
$ my_script.sh r1
$ another_script.sh r1

$ ssh r2
$ scp r2
$ my_script.sh r2
$ another_script.sh r2

sem fazer isso:

$ export r1="build_server_r1"
$ export r2="build_server_r2"

$ ssh $r1
$ scp $r1
$ my_script.sh $r1
$ another_script.sh $r1

$ ssh $r2
$ scp $r2
$ my_script.sh $r2
$ another_script.sh $r2

A razão é que é mais rápido digitar sem '$' na frente de cada r1 r2 do que $ r1 $ r2, então seria ótimo se eu pudesse largar o '$'

    
por Vassilis Papanikolaou 11.05.2016 / 13:28

3 respostas

5

Para o caso de uso específico de SSH, os aliases em ~/.ssh/config são o caminho a percorrer. Esta é a maneira de abreviar um parâmetro do host e um conjunto de opções para o SSH. Eles não apenas não exigem um $ anterior, mas não serão usados em contextos que não chamam nomes de host acessados por SSH e serão usados em outros contextos que exigem nomes de host acessados por SSH, como como SSHFS, rsync, etc.

Host r1
HostName remote_server_1
UserName vassilis

Host r2
HostName remote_server_2
UserName vp

Host r2test
HostName remote_server_2
UserName guest

Para outros casos de uso em que um alias na linha de comando é realmente chamado, o zsh possui aliases globais, definidos com alias -g . Bash não tem tal coisa.

alias -g r1=remote_server_1
ssh r1

O principal problema com aliases globais é que eles serão acionados em qualquer lugar, mesmo quando não fizerem sentido.

% echo r1
remote_server_1

Mas eles não serão acionados se fizerem parte de uma palavra, então scp r1:/some/path . não funcionará.

Se você quiser algo que funcione em qualquer lugar na linha de comando do shell, defina uma variável e digite $ . Se é realmente difícil digitar no teclado, você pode mapeá-lo para uma tecla mais acessível. Por exemplo, para fazer M-v inserir um $ , coloque isso no seu .bashrc :

readline_insert () {
  READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${1}${READLINE_LINE:$READLINE_POINT:}"
  ((READLINE_POINT += ${#1}))
}
bind -x '\ev: readline_insert \$'
    
por 12.05.2016 / 01:50
2

Bem, no caso específico do seu exemplo, onde os valores que você deseja armazenar são nomes de host, sim, você pode. Basta editar seu arquivo /etc/hosts e adicionar estas linhas:

build_server_r1 r1
build_server_r2 r2

Agora você pode executar:

ssh r1
scp r1:/path/to/file .

Se my_script.sh r1 funcionará ou não, depende do seu script. Se você está tentando se conectar ao servidor, provavelmente funcionará. Se você precisar de r1 para expandir para a string remote_server_1 , não será.

    
por 11.05.2016 / 13:36
2

Não existe esse mecanismo. Os aliases fazem isso, mas não funcionam como variáveis. A expansão de variáveis precisa ser marcada com $ (o que não é muito digitação).

Os nomes dos hosts em particular, no entanto, podem ser alias de várias maneiras:

  1. via /etc/host

    $ip|$target_hostname $hostalias
    
  2. via hostfile em nível de usuário especificado em export HOSTALIASES=$the_hostfile

    $hostalias $ip|$target_hostname
    
  3. via dns

  4. através do seu arquivo de configuração ssh ('~ / .ssh / config') (somente ssh):

    Host $hostalias
       HostName $target_hostname
    
por 11.05.2016 / 13:48