他のユーザーの「su -c」はRailsリポジトリで機能しません。

他のユーザーの「su -c」はRailsリポジトリで機能しません。

他のユーザーとして実行されるコマンドが多くのbashスクリプトで動作しないようなコマンドクラスを見つけました。

Railsリポジトリのルートとして:

> su -c 'whoami' at
  at
> su -c 'rake tmp:clear' at
  rake aborted!
  LoadError: cannot load such file -- bundler/setup
> login at
> rake tmp:clear
  (Success)

rails [something]などのさまざまなRails指向コマンドの場合、rake [something]コマンドは実際にatとしてログインしている場合にのみ機能します。

ここで何が起こっているのでしょうか?

ベストアンサー1

これは環境問題のようです$PATH。これらのコマンドを実行すると、su他のユーザー環境のコンテキストでコマンドが実行されます。確認するには、aを実行して、ユーザーとしてログインしたときの結果と比較しsu -c 'echo $PATH' atてください。$PATHat

Bashのようなシェルには、一般的に設定ファイルをインポートする2つの方法があります。 Bashには2つあり、$HOME/.bashrc通常$HOME/.bash_profileこれが実行されます。設定を取得するこの2つの方法は対話型と非対話型と呼ばれ、man bashBashページの呼び出しセクションで説明されています。

INVOCATION
    A login shell is one whose first character of argument zero is a -, or
    one started with the --login option.

    An  interactive  shell is one started without non-option arguments and
    without the -c option whose standard input and error are both connected to
    terminals (as determined by isatty(3)), or one started with the -i option.  PS1
    is set and $- includes i if bash is interactive, allowing a shell script or a
    startup file to test this state.

    The following paragraphs describe how bash executes its startup files.
    If any of the files exist but cannot be read, bash reports an error.  Tildes are
    expanded in file  names  as  described  below  under Tilde Expansion in the
    EXPANSION section.

    When bash is invoked as an interactive login shell, or as a
    non-interactive shell with the --login option, it first reads and executes
    commands from the file /etc/profile, if that file exists.  After read‐ ing 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.

    When a login shell exits, bash reads and executes commands from the files
    ~/.bash_logout and /etc/bash.bash_logout, if the files exists.

    When  an  interactive shell that is not a login shell is started, bash
    reads and executes commands from ~/.bashrc, if that file exists.  This may be
    inhibited by using the --norc option.  The --rcfile file option will force bash
    to read and execute commands from file instead of ~/.bashrc.

    When bash is started non-interactively, to run a shell script, for
    example, it looks for the variable BASH_ENV in the environment, expands its
    value if it appears there, and uses the expanded value as  the name of a file to
    read and execute.  Bash behaves as if the following command were executed: if [
    -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi but the value of the PATH variable is
    not used to search for the file name.

おすすめ記事