Сохранение команды в переменную вместо ее запуска - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь получить выходные данные команды ps для вывода в файл, а затем использовать этот файл для заполнения списка рассылки. Пока что у меня проблемы.

eval "ps -o pid,command">/tmp/process$$
more /tmp/process$$
sed -e '1d' /tmp/process$$ > /tmp/process2$$
    while IFS= read -r pid command
    do
        msgboxlist="$msgboxlist" $($pid) $($command) "off"
    done</tmp/process2$$
    height=`wc -l "/tmp/process$$" | awk '{print $1}'`
    width=`wc --max-line-length "/tmp/process$$" | awk '{print $1}'`
    echo $height $width
    dialog \
        --title "Directory Listing" \
        --radiolist "Select process to terminate" "$msgboxlist" $(($height+7)) $(($width+4))

Пока что чтение не только не разбивает столбцы на 2 переменные ($pid - это целая строка, а $command - пустое), но когда я пытаюсь запустить это, скрипт пытается запустить строку как команда. Например:

+ read -r pid command
++ 7934 bash -x assessment.ba
assessment.ba: line 322: 7934: command not found
+ msgboxlist=
+ off
assessment.ba: line 322: off: command not found

По сути, я понятия не имею, куда я должен помещать кавычки, двойные кавычки и обратную косую черту. Это сводит меня с ума.

tl; dr Сохранение команды в переменную без ее запуска, как?

Ответы [ 4 ]

1 голос
/ 29 марта 2012

Вы пытаетесь выполнить $pid и $command как команды:

msgboxlist="$msgboxlist" $($pid) $($command) "off"

Попробуйте:

msgboxlist="$msgboxlist $pid $command off"

Или используйте массив:

msgboxlist=()  # do this before the while loop
msgboxlist+=($pid $command "off")

# when you need to use the whole list:
echo "${msgboxlist[@]}"
1 голос
/ 29 марта 2012

Ваш скрипт может быть реорганизован путем удаления некоторых ненужных вызовов, таких как:

ps -o pid=,command= > /tmp/process$$
msgboxlist=""
while read -r pid command
do
    msgboxlist="$msgboxlist $pid $command off"
done < /tmp/process2$$

height=$(awk 'END {print NR}' "/tmp/process$$")

width=$(awk '{if (l<length($0)) l=length($0)} END{print l}' "/tmp/process$$")

dialog --title "Directory Listing" \
    --radiolist "Select process to terminate" "$msgboxlist" $(($height+7)) $(($width+4))
0 голосов
/ 29 марта 2012

Используйте двойные кавычки, когда вы хотите, чтобы переменные были расширены.Используйте одинарные кавычки, чтобы отключить расширение переменной.

Вот пример команды, сохраненной для последующего выполнения.

file="readme.txt"
cmd="ls $file" # $file is expanded to readme.txt
echo "$cmd" # ls readme.txt
$cmd # lists readme.txt

Правка для адреса чтения:

Использование чтения обычно читаетвся линияРассмотрим это вместо этого (проверено):

ps o pid=,command= | while read line ; do 
  set $line
  pid=$1
  command=$2 
  echo $pid $command
done

Также обратите внимание на различное использование ps o pid =, command = 'для пропуска отображения заголовков.

0 голосов
/ 29 марта 2012

Должен признать, я не на 100% уверен в том, что вы делаете;но я думаю, что вы хотите изменить это:

        msgboxlist="$msgboxlist" $($pid) $($command) "off"

на это:

        msgboxlist+=("$pid" "$command" off)

, который добавит PID, команду и «off» как три новых элемента в массивназванный msgboxlist.Затем вы должны изменить "$msgboxlist" на "${msgboxlist[@]}" в команде dialog, чтобы включить все эти элементы в качестве аргументов команды.

...