テスト(Ubuntuから)

テスト(Ubuntuから)

私はシェルスクリプティングに比較的慣れていないので、これが簡単な質問のように思えば謝罪します。私はdebian, version 11 (bullseye)SSHを介して()に接続できるLinux VM()を持っており、ssh <ip>いくつかの依存関係(homebrew、pyenvなど)をインストールして正常に使用できます。ただし、VMの外部(スクリプトまたはMac端末を使用)でコマンドを実行しようとすると、関連するエラーがssh <user>@<ip> pyenv versions発生します。bash: line 1: pyenv: command not found

説明した内容と関係があると思います。ここしかし、この問題をどのように避けることができるかわかりません。

以下のコメントに@terdonがリクエストした詳細を追加してください。

$ which pyenv
/home/linuxbrew/.linuxbrew/bin/pyenv

$ grep /home/linuxbrew/.linuxbrew/bin/ ~/.bashrc ~/.bash_profile ~/.profile /etc/bash.bashrc /etc/profile
grep: /home/f0p021s/.bash_profile: No such file or directory
/home/f0p021s/.profile:eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

また、仮想マシン内でパスを見ると、次のようなことに気づきました。

$ echo $PATH
/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

ローカルコンピュータで同様のコマンドを実行しようとすると異なるように見えます。

$ ssh <user>@<ip> 'echo $PATH'
/usr/local/bin:/usr/bin:/bin:/usr/games

ベストアンサー1

コンピュータにSSH接続すると、対話型ログインシェルが起動します。を実行すると、ssh ip command非対話型の非ログインシェルが起動します。

$ ssh localhost 'echo $- $0; shopt login_shell'
hBc bash
login_shell     off

$ ssh localhost
[terdon@tpad ~]$ echo $- $0; shopt login_shell
himBHs -bash
login_shell     on

バラよりこの回答これが実際に何を示しているかを学びましょう。

各タイプのシェルは起動時に異なるファイルを読み込みます。man bash (ハイライト内)から:

bashを次のように使用するとき対話型ログインシェルまたは --login オプションを使用して最初にファイルから読み込み、コマンドを実行する非対話型シェルとして使用する/etc/設定ファイル、ファイルが存在する場合。ファイルを読み込んで見つけます。~/.bash_profile、~/.bash_login、~/.profileの順に、最初の既存および読み取り可能なコマンドからコマンドを読み取り、実行します。この動作は、シェルの起動時に --noprofile オプションを使用して無効にできます。

たとえば、bashが非対話型で起動されたときにシェルスクリプトを実行するには、環境でBASH_ENV変数を探し、その値がある場合は展開し、拡張値を読み取り、実行するファイル名として使用します。 Bashは、次のコマンドが実行されたかのように動作します。

    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

ただし、PATH変数の値はファイル名を取得するためには使用されません。

これで、コマンドがinpyenvに追加されたことがわかりました。上記のように、ファイル()は対話型ログインシェルから読み取られますが、非対話型または非ログインシェルでは読み取られません。なぜなら、これらのファイルは指定された内容だけを読み込み、デフォルトで空であるからです。$PATH/home/f0p021s/.profile~/.profile$BASH_ENV

したがって、あなたのオプションは次のとおりです。

  1. コマンドのフルパスを使用します。

    ssh ip /home/linuxbrew/.linuxbrew/bin/pyenv
    
  2. 源泉~/.profile:

    ssh ip '. ~/.profile; pyenv'
    

おすすめ記事