root
ユーザーからユーザーに対してコマンドを実行する必要がありますgameservice
。残念ながら、はbin ディレクトリPATH
に格納されていないNVM
ため、node
コマンドではありません。
このようにコマンド内で直接エクスポートすることで動作させることはできましたPATH
が、見苦しいです。
su gameservice -l -c "export PATH='$PATH:/home/gameservice/.nvm/versions/node/v13.7.0/bin/' && cd universalgame-server && ./node_modules/.bin/babel src -d dist --source-maps"
しかし、実際に操作してみると、自分のファイル.profile
と自分の.bashrc
ファイルの両方が実行されていることがわかります。
root
と を使用しsu gameservice -l
てからユーザーとしてログインするとecho $PATH
、内部に nvm bin ディレクトリが存在します。
私は bash がどのように動作するかについての基本的な知識が不足しているだけだと思いますが、誰か私の間違いを見つけてもらえませんか?
答え1
ここでの問題は、bash
非対話型シェルとして呼び出されることにあります。bash
マニュアル ページによると、
対話型シェルとは、非オプション引数なしで(-s が指定されていない限り)起動され、-c オプションも指定されず、標準入力とエラーが両方とも端末に接続されている(isatty(3) によって決定される)、または -i オプションで起動されたシェルです。bash が対話型の場合、PS1 が設定され、$- に i が含まれ、シェル スクリプトまたは起動ファイルでこの状態をテストできます。
Ubuntu では、デフォルトは.bashrc
次の行で始まります。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
は.bashrc
実行されますが、すぐに終了することを決定します。これらの行を削除すると、変数はファイルPATH
内の内容に設定され.bashrc
、コマンドを実行できるようになりますnode
。
私の意見では、より良い方法は、必要な環境をすべて設定し、必要なコマンドを実行するスクリプトを作成し、そのスクリプトをユーザーの名前で実行することです。これはどのような場合でも機能し、ユーザーのディレクトリにある起動ファイルに依存することはありません。