
SSHを介してリモートUbuntuシステムに接続してソースをインポートし、.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
それでは、コマンドを呼び出す前にコマンドのソースをどのように確認しますか?
答え1
問題は、非対話型シェルでエイリアスを実行しようとしていることです。を実行すると、ssh user@computer command
非対話command
型で実行されます。
非対話型シェルは(man bashから)エイリアスを読みません。
シェルが非対話型の場合、Shoptを使用してExpand_aliasesシェルオプションを設定しない限り、エイリアスは拡張されません(以下のSHELL BUILTIN COMMANDSの下の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 では無視されます。
答え2
エイリアスを使用しないようにする.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"