Alias ​​de expansão de shell não interativo

12

Estou tendo problemas para obter aliases para expandir minha conta de hospedagem quando executo um comando como:

ssh user@server "bash -c \"alias\""

Meu arquivo .bashrc é:

echo .bashrc
# .bashrc

shopt -s expand_aliases

# Source global definitions (commenting this out does nothing)
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
alias php="php55"
alias composer="php ~/bin/composer.phar"

Quando executo o comando ssh acima, vejo ".bashrc" ecoado. Mas se eu tentar executar aliases, não recebo nada.

Eu poderia tentar "bash -ic", mas na verdade isso está em um script que não posso mudar facilmente e quero saber por que isso não está funcionando.

Saída de ssh user@server "bash -c \"shopt\""

.bashrc
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
dirspell        off
dotglob         off
execfail        off
expand_aliases  off
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         off
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

Saída de ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash
Matt
fonte
Desisti e criei links simbólicos e scripts em ~ / bin que fazem a mesma coisa que eu queria com aliases. Contanto que eu exporte o meu, $PATHpois ~/bin:$PATHele funciona bem.
Matt
No Ubuntu (16.04 e mais recente, com certeza), se você tiver um ~/.local/binquando o /etc/profileprocesso for processado, ele será adicionado automaticamente ao seu PATH. Você também pode logo . /etc/profileapós criar a pasta para adicioná-la ao seu PATH sem precisar reinicializar ou fazer logout / login.
precisa saber é o seguinte

Respostas:

15

Na bash(1)página do manual:

Os aliases não são expandidos quando o shell não é interativo, a menos que a opção do shell expand_aliases seja definida usando shopt (consulte a descrição do shopt em SHELL BUILTIN COMMANDS abaixo).

garça-vermelha
fonte
5
Eu tenho shopt -s expand_aliasesno meu .bashrc, mas isso não parece funcionar. Eu não sei por que não, mas eu acho que essa seria a resposta normalmente
Matt
@ Matt Não tenho certeza da ordem dos 'eventos', mas você tentou se certificar de que shopt -s expand_aliasesestá no seu .bashrcantes dos pseudônimos? Certamente, sua saída na pergunta mostra que expand_aliasesé off.
carmesim-egret
Sim, veja o .bashrc na minha pergunta. Eu vejo a linha de eco, mas shoptmostra como desativada. Talvez exista alguma configuração estranha de servidor que impeça isso, eu não sei. Eu tenho uma solução alternativa
Matt
provavelmente o .bashrcarquivo não estava sendo originado por padrão.
Daniel Farrell
8

O shell que você obtém ao executar um comando remotamente com SSH não é um shell interativo nem um shell de logon:

$ ssh server 'bash -c "echo $-"'
chsB

(não há inem não lna resposta)

No caso de Bash, isso significa que nenhum dos arquivos de inicialização usuais é lido.

Você pode forçar o shell remoto para ser um shell de login, adicionando -là sua invocação Bash, o que significa que iria analisar o primeiro um dos ~/.bash_profile, ~/.bash_logine ~/.profileque ele pode encontrar, em busca nessa ordem, mas não ~/.bashrc. Isso significa que você precisará colocar seus aliases em um desses arquivos.

Kusalananda
fonte
Isso soa como a solução. Eu não estou mais usando esse servidor, então não posso testá-lo, mas provavelmente vale a pena votar novamente no caso de alguém encontrar a pergunta.
Matt
2

Eu tive o mesmo problema e, a princípio shopt -s expand_aliases, não pareceu ajudar. O que descobri é que essas opções devem ser definidas antes de adicionar os aliases reais. Portanto, se os aliases forem criados antes de você .bashrcdefinir as expand_aliasesopções, eles não estarão disponíveis. Portanto, você deve carregar (ou recarregar) aliases depois de definir a opção.

Gene Pavlovsky
fonte
0

bash (1) diz

...

Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de ~ / .bashrc, se esse arquivo existir.

...

Um shell interativo é aquele iniciado sem argumentos de não opção e sem a opção -c cuja entrada e erro padrão estão conectados aos terminais (conforme determinado por isatty (3)) ou um iniciado com a opção -i.

então, obviamente, você fornece o .bashrc manualmente ou o executa com -i

se tudo o que você precisa é de aliases, eu recomendaria dividi-los em, por exemplo, aliases e, em seguida, obtê-los do .bashrc e do seu script, apenas no caso de surgir algo no .bashrc que possa interromper o script, como geralmente acontece

Aleksandar Ivanisevic
fonte
então vejo que o .bashrc está sendo adquirido. Eu vejo a linha de eco do .bashrc quando executo o comando. O problema é que os aliases nesse arquivo não se expandem.
Matt
0

Você pode resolver qualquer problema digitando:

if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi

na primeira linha.

Riccardo La Marca
fonte