web-dev-qa-db-ja.com

非対話型シェルはエイリアスを展開します

次のようなコマンドを実行すると、ホスティングアカウントでエイリアスを展開できません。

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
12
Matt

bash(1)のmanページから:

シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、shoptを使用してexpand_aliasesシェルオプションが設定されている場合を除きます(下記のシェルビルドコマンドの下のshoptの説明を参照してください)。

15
crimson-egret

SSHを使用してリモートでコマンドを実行したときに取得されるシェルは、対話型シェルでもログインシェルでもありません。

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

(レスポンスにilはありません)

Bashの場合、これは通常の初期化ファイルが読み込まれないことを意味します。

-lをBash呼び出しに追加することで、リモートシェルを強制的にログインシェルにすることができます。つまり、検出できる~/.bash_profile~/.bash_login、および~/.profileの最初の1つを解析し、その順序で検索しますが、~/.bashrcは検索しません。つまり、代わりにこれらのファイルの1つにエイリアスを配置する必要があります。

8
Kusalananda

私も同じ問題を抱えていましたが、最初はshopt -s expand_aliasesが役に立たないようでした。私が見つけたのは、実際のエイリアスを追加する前にこのオプションを設定する必要があることです。したがって、.bashrcexpand_aliasesオプションを設定する前にエイリアスが作成された場合、それらは使用できません。したがって、オプションを設定した後にエイリアスをロード(またはリロード)する必要があります。

2
Gene Pavlovsky

bash(1)は言う

...

ログインシェルではないインタラクティブシェルが起動すると、bashは〜/ .bashrcからコマンドを読み取って実行します(そのファイルが存在する場合)。

...

対話型シェルは、非オプション引数なしで-cオプションなしで開始され、標準入力とエラーの両方が端末に接続されている(isatty(3)によって決定される)か、または-iオプションで開始されます。

したがって、明らかに、.bashrcを手動でソースするか、-iを指定して実行します

エイリアスがすべて必要な場合は、たとえば、 .aliasesし、それを.bashrcとスクリプトの両方から調達します。これは、.bashrcで問題が発生し、スクリプトが壊れる可能性があるためです。

次のように入力して問題を解決できます。

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

最初の行で。

0