Shell não interativo expande o alias

9

Estou tendo problemas para fazer aliases se expandirem em 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" echo'd. Mas se eu tentar usar apelidos, não recebo nada.

Eu poderia tentar "bash -ic", mas isso é, na verdade, 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
    
por Matt 18.09.2014 / 11:31

4 respostas

13

Na página bash(1) man:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS below).

    
por 19.09.2014 / 16:33
6

O shell que você obtém quando executa um comando remotamente com o SSH não é um shell interativo nem um shell de login:

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

(não há i e não l na resposta)

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

Você pode forçar o shell remoto a ser um shell de login adicionando -l à sua chamada Bash, o que significa que ele analisaria o primeiro de ~/.bash_profile , ~/.bash_login e ~/.profile que pode encontrar , pesquisando nessa ordem, mas não ~/.bashrc . Isso significa que você terá que colocar seus alias em um desses arquivos.

    
por 19.06.2016 / 14:35
1

bash (1) diz

...

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists.

...

An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option.

então, obviamente, você pode usar o .bashrc manualmente ou executá-lo com -i

Se os aliases forem tudo o que você precisa, eu recomendaria que eles sejam divididos em, por exemplo, .aliases e, em seguida, fonte de ambos .bashrc e seu script, apenas no caso de coisas se arrasta em .bashrc que pode quebrar seu script, como muitas vezes acontece

    
por 18.09.2014 / 11:40
1

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

    
por 19.06.2016 / 14:22