Eu regularmente ssh
em vários servidores diferentes, alguns dos quais não têm fish
instalado, mas muitos têm. Eu gostaria de obter fish
como shell, se disponível (alterar no meio do caminho é sempre tedioso e você perde o histórico do que já digitou), mas alterar o shell padrão não é uma boa ideia, pois:
- existem muitas máquinas diferentes que eu precisaria mudar;
- em muitos outros estou logado através do LDAP, e mudar meu shell como armazenado no LDAP quebraria em máquinas onde
fish
não está disponível; - em geral, como
fish
não é compatível com POSIX-sh, colocá-lo como shell padrão pode quebrar comandos executados por scripts por meio dessh
; - finalmente, existem algumas máquinas onde o usuário é compartilhado com outras pessoas (ou, onde eu tenho que logar outro usuário), então mudar o shell padrão não é uma boa ideia.
Então, idealmente, eu gostaria de ter um comando como ssh
esse iniciado automaticamente fish
, se disponível, ou apenas deixar o shell padrão fornecido de outra forma.
Depois de alguns experimentos, montei o
fissh
script:"$@"
encaminha todos os argumentos passados parassh
-t
força a alocação de um tty (caso contrário,ssh
o padrão não é tty quando um comando é especificado)sh -c
é necessário porque não sabemos qual shell podemos ter do outro lado - em minhas máquinas pessoais eu tenhofish
como shell padrão, que quebraria naif
sintaxe diferente;which fish
é bem-sucedido se encontrar um executávelfish
; nesse caso, éexec
-ed (pedindo um shell interativo e de login);$SHELL
, que é o shell padrão para o usuário atual ($
é escapado, caso contrário, é expandido porsh
"neste lado").-li
é passado em ambos os casos, para garantir que realmente tenhamos um shell interativo de login. Embora seja obrigatório pelo POSIX para qualquer shell, é "apenas" uma extensão comum, mas não colocá-la provavelmente resultará em surpresas ruins.-i
-l
Observe que
stdout
ofwhich
está oculto (como no caso normal não nos importamos ondefish
foi encontrado), masstderr
(onde a mensagem de erro quefish
não pôde ser encontrada) é intencionalmente deixada intacta como um aviso ao usuário que, apesar de nosso melhor intenções,fish
não foi encontrado.Para completar a experiência, em minhas máquinas com
fish
adiciono o suporte para preenchimento personalizado criando um~/.config/fish/completions/fissh.fish
arquivo contendopara instruir
fish
quefissh
tenha exatamente as mesmas conclusões válidas quessh
.Este pequeno script esperado (não testado) faria, eu acho, a mesma coisa:
Suposições: