Eu quero ssh em um computador Ubuntu remoto, fonte meu .bashrc
e executar um comando que depende dos parâmetros definidos por isso .bashrc
. Tudo isso em um shell interativo que não fecha após a conclusão do comando.
O que eu tentei até agora é
ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'
ou apenas
ssh user@remote_computer -t "my_alias;bash"
Isso funciona para comandos gerais (como ls
por exemplo), mas quando tento executar um alias definido em .bashrc
, recebo um erro:
bash: my_alias: command not found
Mas quando eu escrevo manualmente novamente e o executo, ele funciona!
Então, como posso ter certeza de que a .bashrc
fonte é originada antes que o comando seja chamado?
Respostas:
O problema é que você está tentando executar um alias em um shell não interativo. Quando você executa
ssh user@computer command
,command
é executado de forma não interativa.Os shells não interativos não lêem pseudônimos (do man bash):
Funciona se você executá-lo novamente manualmente, porque o
bash
comando final inicia um shell interativo para que seus aliases estejam agora disponíveis.Como alternativa, você pode iniciar um shell interativo (
bash -i
) em vez de um simples shell de login (bash -l
) na máquina remota para executar seu alias:Esta parece ser uma abordagem muito complicada. Você não explicou por que exatamente precisa fazer isso, mas considere estas alternativas:
Basta iniciar um shell interativo de login normal na máquina remota e execute o comando manualmente:
Se você sempre deseja que o alias seja executado quando você se conecta a este computador, edite o
~/.profile
(ou~/.bash_profile
, se houver) do computador remoto e adicione esta linha no final:Como
~/.profile
é lido sempre que um shell de login é iniciado (portanto, toda vez que você se conecta viassh
, por exemplo), isso fará commy_alias
que seja executado sempre que você se conectar.Observe que, por padrão, os shells de login leem
~/.profile
ou~/.bash_profile
ignoram~/.bashrc
. Algumas distribuições (Debian e seus derivados e Arch, por exemplo), como o Ubuntu, têm sua origem padrão~/.profile
ou~/.bash_profile
arquivos, o~/.bashrc
que significa que seus aliases definidos~/.bashrc
também estarão disponíveis em um shell de login. Isso não é verdade para todas as distribuições; portanto, você pode precisar editar~/.profile
manualmente para obter a fonte~/.bashrc
. Observe também que, se~/.bash_profile
existir,~/.profile
será ignorado pelo bash.fonte
~/.basyrc
é lido automaticamente por~./profile
, portanto, qualquer alias definido~/.bashrc
também estará disponível para qualquer leitura de shell~/.profile
. Tudo o que você realmente precisava fazer para que isso funcionasse era iniciar explicitamente um shell interativo (-i
).Eu tive que comentar uma parte do meu .bashrc que impedia o uso de alias e adicionar um comando expand_aliases. Isso foi comentado
E isso foi adicionado
Então meu comando funcionou:
fonte