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


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、それはうまく動作します。
Matt

Ubuntu(確かに16.04以降)では~/.local/bin/etc/profileが処理されると、PATHに自動的に追加されます。. /etc/profileフォルダーを作成した直後に、再起動やログアウト/ログインを行わずに、PATHにフォルダーを追加することもできます。
dragon788 '20

回答:


15

bash(1)manページから:

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


5
私はshopt -s expand_aliases.bashrcに持っていますが、それはうまくいかないようです。なぜかはわかりませんが、これが通常の答えになると思います
Matt

@Matt私は確かに「イベント」のためではないんだけど、あなたは確認してみましたshopt -s expand_aliases、あなたの中にある.bashrcの前に別名?確かに、質問の出力はexpand_aliasesですoff
クリムゾンサギ

ええ、私の質問の.bashrcを見てください。エコーラインshoptは表示されますが、オフとして表示されます。たぶん、これを妨げている奇妙なサーバー設定があるだけかもしれません。私は回避策を持っています
Matt

おそらく.bashrcファイルはデフォルトで供給されていませんでした。
ダニエル・ファレル2017

8

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

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

(応答にはiありませんl

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

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


これは解決策のように聞こえます。私はこのサーバーをもう使用していないので、テストすることはできませんが、誰かが質問を見つけた場合に備えて、これに投票する価値があります。
Matt

2

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


0

bash(1)は言う

...

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

...

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

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

エイリアスがすべて必要な場合は、.aliasesなどでエイリアスを分割し、.bashrcとスクリプトの両方からソースを取得することをお勧めします。


.bashrcが読み込まれていることがわかります。コマンドを実行すると、.bashrcからのエコー行が表示されます。問題は、そのファイルのエイリアスが拡張されないことです。
Matt

0

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

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

最初の行で。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.