Bash
非互動式 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
從
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
。這意味著您必須將別名放在這些文件之一中。