基本的に実行する必要があるinitスクリプトを書きたい
nvm use v0.11.12 && forever start /srv/index.js
ユーザーとしてwebconfig
。 nvm
は、~webconfig/.nvm/nvm.sh
で宣言されているシェル関数であり、webconfig
のsource ~/.nvm/nvm.sh
の.bashrc
を介して含まれています。
私は以下を試しました:
Sudo -H -i -u webconfig nvm
echo "nvm" | Sudo -H -i -u webconfig
しかし、彼らは失敗します
-bash:nvm:コマンドが見つかりません
-bash:1行目:nvm:コマンドが見つかりません
Sudo -H -i -u webconfig
を実行してそのシェルに手動でnvm
と入力すると、機能します。私は何が間違っているのですか?
ここでの問題は、よくあることですが、さまざまなタイプのシェルに関するものです。
ターミナルエミュレータ(たとえば、gnome-terminal
)を開くと、インタラクティブ、非ログインシェルと呼ばれるものが実行されます。
コマンドラインからマシンにログインするか、su username
やSudo -u username
などのコマンドを実行すると、対話型ログインシェルが実行されます。
したがって、開始したシェルのタイプに応じて、異なるスタートアップファイルのセットが読み取られます。 man bash
から:
When bash is invoked as an interactive login Shell, or as a non-inter‐
active Shell with the --login option, it first reads and executes com‐
mands from the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in that order, and reads and executes commands from the first one that
exists and is readable. The --noprofile option may be used when the
Shell is started to inhibit this behavior.
つまり、~/.bashrc
はログインシェルによって無視されます。 Sudo
に対して-i
オプションを使用しているため、ユーザーのログインシェルのスタートアップファイルが(man Sudo
から)読み取られています。
-i, --login
Run the Shell specified by the target user's password data‐
base entry as a login Shell. This means that login-specific
resource files such as .profile or .login will be read by the
Shell.
だから、あなたができることは
代わりに、ユーザーの~/.profile
または~/.bash_profile
で関数を定義してください。 ~/.profile
が存在する場合、~/.bash_profile
は無視されることに注意してください。また、~/.bash_profile
はbash固有であるため、代わりに.profile
を使用しますが、~/.bash_profile
が存在しないことを確認してください。
ソース~/.nvm/nvm.sh
from ~/.profile
。
@ terdon はすでにこれについていくつかの良い詳細を追加しているので、ここでは繰り返しません。言い換えると、問題の原因は、bash
がログインシェルとして呼び出されたときに.bashrc
を自動的に取得せず、代わりに~/.bash_profile
、~/.bash_login
、または~/.profile
のみ。
これらのプロファイルファイルの1つにコードを追加して、.bashrc
を取得するのが一般的な方法です。デフォルトでは、~/.profile
に次のコードがあります。
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
以下のコメントから、最善の解決策はおそらく[ -z "$PS1" ] && return
から.bashrc
行を削除し、他のすべてをそのままにしておくことだと思います。
Sudo -Hu webconfig bash -c '. ~/.nvm/nvm.sh && nvm'