web-dev-qa-db-ja.com

.bashrcをソースした後、sshを使用して対話型シェルでコマンドを実行します。

リモートの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が確実にソースされるようにするにはどうすればよいですか?

11
Mehdi

問題は、非対話型シェルでエイリアスを実行しようとしていることです。 _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"'
_

ただし、これは非常に複雑なアプローチのようです。正確にこれを行う必要がある理由を説明していませんが、次の代替案を検討してください。

  1. リモートマシンで通常のログインインタラクティブシェルを起動し、コマンドを手動で実行するだけです。

    _user@local $ ssh user@remote
    user@remote $ my_alias
    _
  2. このコンピューターに接続するときに常にそのエイリアスを実行したい場合は、リモートコンピューターの_~/.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によって無視されます。

9
terdon

エイリアスの使用を妨げている.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"
5
Mehdi