非交互式外壳扩展别名


12

运行以下命令时,我无法在主机帐户上扩展别名:

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

我已经放弃了,只是在〜/ bin中创建了符号链接和脚本,这些符号链接和脚本与别名具有相同的作用。只要导出我$PATH~/bin:$PATH它工作得很好。
马特

在Ubuntu(肯定是16.04和更高版本)上,如果您~/.local/bin/etc/profile处理时将其自动添加到您的PATH中。您也可以. /etc/profile在创建文件夹后立即将其添加到您的PATH中,而无需重新启动或注销/登录。
dragon788

Answers:


15

bash(1)手册页:

如果外壳不是交互式的,则别名不会扩展,除非使用shopt设置expand_aliases shell选项(请参见下面的SHELL BUILTIN COMMANDS下的shopt的说明)。


5
shopt -s expand_aliases我的.bashrc中确实有,但这似乎不起作用。我不确定为什么不这样做,但是我想这通常是答案
Matt

@Matt我不确定'事件'的顺序,但是您是否尝试确保别名shopt -s expand_aliases在您.bashrc的别名之前?当然,您在问题显示中的输出expand_aliasesoff
深红色的白鹭

是的,请参阅我的问题中的.bashrc。我看到了回声线,但shopt确实显示为关闭。我不知道,也许只有一些奇怪的服务器设置可以阻止这种情况。我有一个解决方法
Matt

.bashrc默认情况下,该文件可能不是源文件。
丹尼尔·法雷尔

8

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

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

(响应中没有i,也没有l

在Bash的情况下,这意味着没有读取任何常规的初始化文件。

您可以强制远程shell加入是一个登录shell -l到你的Bash调用,这意味着它会分析的第一个~/.bash_profile~/.bash_login~/.profile它可以找到,按顺序搜索,但没有~/.bashrc。这意味着您必须将别名放入其中一个文件中。


这听起来像解决方案。我什至不再使用此服务器,因此无法对其进行测试,但是如果有人发现问题,可能值得提出建议。
马特

2

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


0

bash(1)说

...

当启动非登录外壳程序的交互式外壳程序时,bash从〜/ .bashrc读取并执行命令(如果该文件存在)。

...

交互式外壳程序是一个不带非选项参数且不带-c选项(其标准输入和错误都连接到终端(由isatty(3)确定))启动的外壳程序,或一个以-i选项启动的外壳程序。

因此,显然,您可以手动获取.bashrc或使用-i运行它

如果您只需要别名,我建议您将其拆分为例如.aliases,然后从.bashrc和您的脚本中获取它们,以防万一,.bashrc中的内容爬行可能会破坏您的脚本,这种情况经常发生


所以我看到.bashrc的来源。运行命令时,我看到了来自.bashrc的回显线。问题是该文件中的别名无法扩展。
马特

0

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

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

在第一行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.