2013-05-01 3 views
-3

У меня интересная ситуация. Весь код здесь представляет собой пример функционального псевдокода точной проблемы, с которой я сталкиваюсь, поэтому не шутите о назначении вывода date. Я действительно хочу захватить вывод более медленной функции, зависящей от ресурсов, но date хорошо работает, чтобы показать функциональное препятствие, с которым я столкнулся.Получение идентификатора процесса и присвоение переменной в скрипте Bash

Я пишу Баш скрипт, где я хочу, чтобы назначить выход процесса переменной следующим образом:

RESPONSE=$(nice -n 19 date); 

Теперь это дает мне RESPONSE в хорошей переменной, не так ли? Хорошо, что, если я хочу получить идентификатор процесса функции, вызванной в пределах $()? Как мне это сделать? Я предполагал, что это будет работать:

RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`)); 

который не дает мне идентификатор процесса в переменной PID, но я больше не получить выходной сигнал, отправляемый в RESPONSE.

Код, который я использую в качестве функционального примера, это. Этот пример работает, но не PID; да я не назначая PID но опять-таки это пример:

RESPONSE=$(nice -n 19 date); 
wait ${PID}; 
echo "${RESPONSE}"; 
echo "${PID}"; 

Этот пример дает мне PID, но не RESPONSE:

RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`)); 
wait ${PID}; 
echo "${RESPONSE}"; 
echo "${PID}"; 

Каждый знает, как я могу получить значение RESPONSE с PID также?

+1

Это выглядит так, как будто вы решили КАК что-то сделать, но что-то неясно. Нам нужно описание того, что вам нужно делать, а не то, как вы думали, что вам следует это делать. Предположим, что кто-то здесь уже знает, как делать то, что вы действительно хотите, а не то, что вы говорите нам, что думаете, что вам следует делать ... так что если вы скажете нам, тогда вы получите ответ, который будет работать. Где мы сейчас не помогаем вам вообще. –

+0

Джим, я хочу сделать именно то, что показывает сценарий. Я хочу получить идентификатор процесса, а затем сценарий ждет завершения этого процесса, прежде чем переходить к следующему шагу.Но, если то, что говорит Луис, истинно, возможно, просто обернуть функцию в '$()' достаточно, чтобы гарантировать, что следующие шаги не будут выполняться до тех пор, пока не будет назначена переменная? – JakeGould

ответ

7

В зависимости от того, как именно вы установите его, используя RESPONSE=$(backgroundcommand) будет либо ждать команды для завершения (в этом случае это слишком поздно, чтобы получить его PID), или не будет ждать команды для завершения (в в этом случае его вывод еще не существует, и это не может быть отнесено к RESPONSE). Вы будете иметь, чтобы сохранить выход где-то команда в другой (например, временный файл), а затем собрать его, когда процесс заканчивается:

responsefile=$(mktemp -t response) 
nice -n 19 date >$responsefile & 
pid=$! 
wait $pid 
response=$(<$responsefile) 
rm $responsefile 

(Обратите внимание, что $(<$responsefile) конструкция доступна только в Баш, а не в Если вы не запустили скрипт с #!/bin/bash, вместо этого используйте $(cat $responsefile).)

Это все еще может не делать то, что вы ищете, потому что (по крайней мере, насколько я вижу), что вы «поиск действительно не имеет смысла. ПИД-код команды и выход никогда не существуют одновременно, поэтому получение обоих не имеет смысла. Сценарий, который я дал выше, технически дает вам обоим, но pid не имеет значения (процесс существовал) по времени, когда назначается время ответа, поэтому, пока вы имеете pid в конце, это бессмысленно.

+0

Ваше объяснение имеет смысл для моих целей. Спасибо, что нашли время, чтобы дать правильный ответ. – JakeGould

Смежные вопросы