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).
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
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.
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
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.