次のようなコマンドを実行すると、ホスティングアカウントでエイリアスを展開できません。
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)
のmanページから:
シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、shoptを使用してexpand_aliasesシェルオプションが設定されている場合を除きます(下記のシェルビルドコマンドの下のshoptの説明を参照してください)。
SSHを使用してリモートでコマンドを実行したときに取得されるシェルは、対話型シェルでもログインシェルでもありません。
$ ssh server 'bash -c "echo $-"'
chsB
(レスポンスにi
とl
はありません)
Bashの場合、これは通常の初期化ファイルが読み込まれないことを意味します。
-l
をBash呼び出しに追加することで、リモートシェルを強制的にログインシェルにすることができます。つまり、検出できる~/.bash_profile
、~/.bash_login
、および~/.profile
の最初の1つを解析し、その順序で検索しますが、~/.bashrc
は検索しません。つまり、代わりにこれらのファイルの1つにエイリアスを配置する必要があります。
私も同じ問題を抱えていましたが、最初はshopt -s expand_aliases
が役に立たないようでした。私が見つけたのは、実際のエイリアスを追加する前にこのオプションを設定する必要があることです。したがって、.bashrc
がexpand_aliases
オプションを設定する前にエイリアスが作成された場合、それらは使用できません。したがって、オプションを設定した後にエイリアスをロード(またはリロード)する必要があります。
bash(1)は言う
...
ログインシェルではないインタラクティブシェルが起動すると、bashは〜/ .bashrcからコマンドを読み取って実行します(そのファイルが存在する場合)。
...
対話型シェルは、非オプション引数なしで-cオプションなしで開始され、標準入力とエラーの両方が端末に接続されている(isatty(3)によって決定される)か、または-iオプションで開始されます。
したがって、明らかに、.bashrcを手動でソースするか、-iを指定して実行します
エイリアスがすべて必要な場合は、たとえば、 .aliasesし、それを.bashrcとスクリプトの両方から調達します。これは、.bashrcで問題が発生し、スクリプトが壊れる可能性があるためです。
次のように入力して問題を解決できます。
if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi
最初の行で。