Вы можете получить pid с помощью файловых дескрипторов, но это больно. Например:
{ PID=$({ (
echo foo;
echo bar;
sh -c 'echo $$ >&5; exec echo baz') |
tr a o; } 5>&1 1>&3); } 3>&1
присвоит PID «echo baz» PID. Замените это эхо на vlc
и замените tr
на sed
, и у вас должно быть решение.
Чтобы попытаться дать несколько упрощенное объяснение того, что здесь происходит, сначала обратите внимание, что мы используем замещение процесса, чтобы присвоить значение PID
. Синтаксис $()
просто берет команду внутри круглых скобок и назначает переменной выход команды. Важно помнить, что здесь «вывод» означает «все, что напечатано в дескрипторе файла 1». Внутри команды sh
мы печатаем pid для дескриптора файла 5, а затем exec echo
. Используя exec, это эхо имеет тот же pid, что и предыдущее эхо. Теперь эхо foo, bar и baz все записывают в трубу, которая идет в tr. Вывод tr перенаправляется на fd 3 (до редактирования, это был fd 2. Какой дескриптор файла использовать, в основном, произвольный, но изменение 2 - плохая идея в случае возникновения каких-либо ошибок), а файловый дескриптор 5 перенаправляется на fd 1, так что он становится «выходом» подстановки процесса, назначенной PID. Затем вне подстановки процесса мы назначаем fd 3 для вывода, где это было первоначально желательным. Надеюсь, этот параграф более объяснительный, чем запутывание: если вы смущены, посмотрите на код для разъяснения!
К сожалению, это становится уродливой, если вы хотите работать в фоновом режиме:
{ PID=$({ (
echo foo;
echo bar;
sh -c 'echo $$ >&5; exec 5>&-; exec echo baz' >&3 &) |
tr a o; } 5>&1 1>&3); } 3>&1
Здесь вам нужно закрыть дескриптор файла 5, чтобы гарантировать, что замена процесс завершается.
@mbratch в приведенном выше коде, PID, который я получаю, исходит от команды «tee» – Vodaldrien
Почему вы хотите pid? Если вы планируете отправлять сигнал только через определенный промежуток времени, то, вероятно, гораздо проще использовать 'timeout' или поместить команду' vlc' внутри сценария оболочки, которая сделает тайм-аут для вас. –
@WilliamPursell У меня не было знания тайм-аута, так как я нахожусь в начале с bash. спасибо за предложение. Я попробую это – Vodaldrien