非交互式 shell 扩展别名

非交互式 shell 扩展别名

当我运行如下命令时,无法在我的托管帐户上扩展别名:

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

我的 .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"

当我运行上面的 ssh 命令时,我确实看到“.bashrc”回显。但如果我尝试运行别名,我什么也得不到。

我可以尝试“bash -ic”,但这实际上是在一个我无法轻易更改的脚本中,我想知道为什么这不起作用。

输出 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

输出 ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

答案1

bash(1)手册页:

当 shell 非交互式时,别名不会展开,除非使用 shopt 设置 Expand_aliases shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

答案2

使用 SSH 远程执行命令时获得的 shell 既不是交互式 shell,也不是登录 shell:

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

(回复中没有i也没有)l

在 Bash 的情况下,这意味着不会读取任何常用的初始化文件。

您可以通过添加到 Bash 调用来强制远程 shell 成为登录 shell ,这意味着它将解析、 、-l中的第一个,并且可以按该顺序搜索找到,但不能。这意味着您必须将别名放入这些文件之一中。~/.bash_profile~/.bash_login~/.profile~/.bashrc

答案3

我也遇到了同样的问题,一开始shopt -s expand_aliases似乎没有帮助。我发现应该在添加实际别名之前设置此选项。因此,如果在.bashrc设置选项之前创建别名expand_aliases,它们将不可用。因此,您应该在设置选项后加载(或重新加载)别名。

答案4

您可以通过输入以下内容来解决任何问题:

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

在第一行。

相关内容