su user -l と su user -l -c "cmd" は同じ結果になりません

su user -l と su user -l -c "cmd" は同じ結果になりません

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

私の意見では、より良い方法は、必要な環境をすべて設定し、必要なコマンドを実行するスクリプトを作成し、そのスクリプトをユーザーの名前で実行することです。これはどのような場合でも機能し、ユーザーのディレクトリにある起動ファイルに依存することはありません。

関連情報