Работают ли переменные оболочки внутри исполняемых команд sudo?

Я пытаюсь запустить, а затем убить фоновый процесс, как другой пользователь внутри скрипта. Тем не менее, я не могу захватить идентификатор фонового процесса с "$!", что означает, что я не могу потом убить процесс.

Вот простой пример, который я собрал для иллюстрации:

#!/bin/bash
userOfThisScript=`id -u -n $SUDO_USER`

sudo -u $userOfThisScript /bin/bash << EOBLOCK
    vi &
    echo "BG Task ID inside block:  <$!>" # <-- $! is empty string
    kill $!
EOBLOCK

Запуск фонового процесса работает нормально. Проверяя выполненный процесс (например, с помощью "ps"), я могу подтвердить, что этот процесс действительно принадлежит пользователю, отданному sudo. Тем не менее, $! переменная это просто пустая строка (насколько я могу судить).

Если я удаляю блок sudo/bash и просто выполняю процесс и уничтожаю его, то все работает, как и ожидалось, с правильным идентификатором процесса, хранящимся в $ !.

Кто-нибудь есть идеи, почему $! не работает внутри этой команды sudo/bash?

(Я использую дистрибутивы Linux/Ubuntu, 14.04 и 16.04.)

1 ответ1

1

Здесь документы с разделителями без кавычек подвергаются переменному расширению. Следовательно, $! интерпретируется в контексте внешнего скрипта, а не оболочки, которая запускает команды из этого документа.

Либо заключите в кавычки << 'EOBLOCK' , либо поставьте обратную косую черту в долларах в документе здесь: kill \$! ,

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .