Linux/ Почему команда su работает из CMD, но не из скрипта?

#linux

#linux

Вопрос:

У меня есть следующий скрипт:

 cd /home
touch $PF ; chown $NU.$NU $PF
su -p -s /bin/sh root -c "node"
  

Когда я запускаю ее, она выдает следующую ошибку:

 sh: node: command not found
  

Но когда я запускаю ее из командной строки Linux, она завершается успешно и выдает мне командную строку node.

В чем может быть причина этого?

Комментарии:

1. другое PATH ? Попробуйте echo $PATH перед выполнением команды.

2. показать ls -a /path/to/node

3. Вопрос здесь не по теме, попробуйте superuser.com чтобы получить ответ.

4. @mata su -p должен сохранять environment, в том числе PATH , но я тоже настроен скептически.

5. @mata хороший улов, это выглядело как PATH проблема. Вот почему я был настроен скептически. Рад, что это имеет смысл.

Ответ №1:

node вероятно, не у root пользователя $PATH .

Я проверил su документацию и заметил следующее:

 -m, -p, --preserve-environment
   Preserve the current environment, except for:

   $PATH
       reset according to the /etc/login.defs options ENV_PATH or ENV_SUPATH (see below);
[...]
   ENV_PATH (string)
       If set, it will be used to define the PATH environment variable when a regular user login. The value can be
       preceded by PATH=, or a colon separated list of paths (for example /bin:/usr/bin). The default value is
       PATH=/bin:/usr/bin.

   ENV_SUPATH (string)
       If set, it will be used to define the PATH environment variable when the superuser login. The value can be
       preceded by PATH=, or a colon separated list of paths (for example /sbin:/bin:/usr/sbin:/usr/bin). The default
       value is PATH=/sbin:/bin:/usr/sbin:/usr/bin.
  

Таким образом, хотя у вас может быть node в текущем $PATH , это может быть не в root ‘s $PATH .

Как уже упоминали некоторые комментаторы, вы можете попробовать указать абсолютное значение $PATH для node :
su -p -s /bin/sh root -c "/path/to/node"

Если вы можете вызвать ее node от вашего текущего пользователя, попробуйте which node определить полный путь к исполняемому файлу.

Вы также можете попробовать повторить свой $PATH .
su -p -s /bin/sh root -c 'echo $PATH'

Комментарии:

1. Хороший улов. Это относительно новое изменение, man su происходящее между coreutil 8.9 и переходом к util-linux 2.22.