Depois de algumas experiências, juntei o script fissh :
#!/bin/sh
ssh "$@" -t "sh -c 'if which fish >/dev/null ; then exec fish -li; else exec \$SHELL; fi'"
-
"$@"encaminha todos os argumentos passados parassh -
-tforça a alocação de um tty (caso contrário,sshassumirá o padrão quando nenhum comando for especificado) -
sh -cé necessário porque não sabemos qual shell teremos do outro lado - em minhas máquinas pessoais eu tenhofishcomo shell padrão, o que quebraria na diferente sintaxeif; -
which fishé bem-sucedido se encontrar um executávelfish; Nesse caso, éexec-ed (pedindo por um shell interativo e de login); - caso contrário, voltaremos a
$SHELL, que é o shell padrão para o usuário atual ($tem escape, caso contrário, ele é expandido porsh"deste lado").
Observe que stdout de which está oculto (como no caso normal, não nos importamos onde fish foi encontrado), mas stderr (onde a mensagem de erro de que fish não pôde ser encontrado intencionalmente deixado intacto como um aviso ao usuário de que, apesar de nossas melhores intenções, fish não foi encontrado.
Para concluir a experiência, em minhas máquinas com fish , adiciono o suporte para conclusão personalizada criando um arquivo ~/.config/fish/completions/fissh.fish contendo
complete -c fissh -w ssh
para instruir fish que fissh tem exatamente as mesmas conclusões válidas que ssh .