Bash

非互動式 shell 擴展別名

  • January 22, 2020

當我執行以下命令時,我無法獲取別名以擴展我的主機帳戶:

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

bash(1)手冊頁:

當 shell 不是互動式時,別名不會展開,除非 expand_aliases shell 選項使用 shopt 設置(參見下面 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

使用 SSH 遠端執行命令時獲得的 shell 既不是互動式 shell,也不是登錄 shell:

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

(響應中沒有i和沒有)l

在 Bash 的情況下,這意味著沒有讀取任何通常的初始化文件。

您可以通過添加到您的 Bash 呼叫來強制遠端 shell 成為登錄 shell -l,這意味著它將解析 , 的第一個~/.bash_profile~/.bash_login並且~/.profile它可以找到,按該順序搜尋,但不能~/.bashrc。這意味著您必須將別名放在這些文件之一中。

引用自:https://unix.stackexchange.com/questions/158038