リモートのUbuntuコンピューターにsshで接続し、.bashrc
をソーシングして、.bashrc
で設定されたパラメーターに依存するコマンドを実行します。これらはすべて、コマンドの実行後に閉じないインタラクティブシェル内にあります。
今までやってみたのは
ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'
あるいは単に
ssh user@remote_computer -t "my_alias;bash"
これは一般的なコマンド(たとえばls
など)で機能しますが、.bashrc
で定義されたエイリアスを実行しようとすると、エラーが発生します。
bash: my_alias: command not found
しかし、もう一度手動で記述して実行すると、うまくいきます。
では、コマンドが呼び出される前に.bashrc
が確実にソースされるようにするにはどうすればよいですか?
問題は、非対話型シェルでエイリアスを実行しようとしていることです。 _ssh user@computer command
_を実行すると、command
が非対話的に実行されます。
非対話型シェルはエイリアスを読みません(man bashから):
シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、shoptを使用してexpand_aliasesシェルオプションが設定されている場合を除きます(下記のシェルビルドコマンドの下のshoptの説明を参照してください)。
最後のbash
コマンドがインタラクティブシェルを起動してエイリアスを使用できるようになるため、手動で再度実行すると機能します。
別の方法として、リモートマシンで単純なログインシェル(_bash -i
_)の代わりにインタラクティブシェル(_bash -l
_)を起動して、エイリアスを実行することもできます。
_ssh user@remote_computer -t 'bash -ic "my_alias;bash"'
_
ただし、これは非常に複雑なアプローチのようです。正確にこれを行う必要がある理由を説明していませんが、次の代替案を検討してください。
リモートマシンで通常のログインインタラクティブシェルを起動し、コマンドを手動で実行するだけです。
_user@local $ ssh user@remote
user@remote $ my_alias
_
このコンピューターに接続するときに常にそのエイリアスを実行したい場合は、リモートコンピューターの_~/.profile
_(または存在する場合は_~/.bash_profile
_)を編集し、最後に次の行を追加します。
_my_alias
_
_~/.profile
_は、ログインシェルが起動するたびに読み込まれるため(たとえば、ssh
を介して接続するたびに)、接続するたびに_my_alias
_が実行されます。
デフォルトでは、ログインシェルは_~/.profile
_または_~/.bash_profile
_を読み取り、_~/.bashrc
_を無視することに注意してください。 Ubuntuなどの一部のディストリビューション(Debianとその派生物、Archなど)には、デフォルトの_~/.profile
_または_~/.bash_profile
_ファイルソース_~/.bashrc
_があります。これは、_~/.bashrc
_で定義されたエイリアスがログインシェルでも利用できます。これはすべてのディストリビューションに当てはまるわけではないため、_~/.profile
_をソースにするために_~/.bashrc
_を手動で編集する必要がある場合があります。また、_~/.bash_profile
_が存在する場合、_~/.profile
_はbashによって無視されます。
エイリアスの使用を妨げている.bashrcの一部にコメントし、expand_aliasesコマンドを追加する必要がありました。これはコメントされました
# If not running interactively, don't do anything
#case $- in
# *i*) ;;
# *) return;;
#esac
そして、これが追加されました
if [ -z "$PS1" ]; then
shopt -s expand_aliases
fi
次に、私のコマンドは機能しました:
ssh user@remote_computer -t "my_alias;bash"