разбросать по переменным строку (shell)

Eval предложили, а про простой read никто не вспомнил.
read PID SIZE COMM <<<$(ps -eo pid,size,comm --sort -size | awk 'NR==2 {print $1,$2,$3}')
<<< разве не является фишкой продвинутых шелов типа баш зсш?

к примеру в dash оно уже не работает, а eval работает
Неловко вышло
sh --version
GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Хотя как там в sh утверждать не возьмусь, не изучал.
ну да ls -l /bin/sh .. /bin/sh -> bash

так что с практической стороны, уже нет смысла цепляться за что-то типа чистого sh
Все таки лучше писать
awk '{NR==2 print $1, $2, substr($0,index($0,$3))}'
Имя может состоять не из одного слова.
anode
слова
Что есть слово? Если отделение пробелами/табами, то man ps
comm COMMAND command name (only the executable name)
Все остальное регулируется сепаратором awk.
Я беру команду ps приведенную ТС, третье поле у меня "Web Content" процесса "Web" у меня нет.
ЗЫ. Я думаю, здесь уместно будет вспомнить анекдот, про надпись на заборе.
[[email protected] openbox]# ps -eo pid,size,comm --sort -size |awk ' NF > 3 {print $0}'
882 1078300 Web Content
671 703088 Web Content
928 652132 Web Content
731 414836 Web Content
anode
Я беру команду ps приведенную ТС, третье поле у меня "Web Content" процесса "Web" у меня нет.
в таком случае, как вариант, можно передавать данные в awk с другим разделителем отличным от пробела, а имя на выходе закавычить:
ps -e -o size -o ";%p;%c" --sort -size | awk -F";" 'NR==2 {print "pid="$2" mem="$1" name=\""$3"\""}'
на выходе получим примерно такое:
pid=2129 mem=495968 name="Web Content"
Вариантов, как всегда, много, но,например, в моем роутере команда ps имеет только один параметр w, соответственно и команда выводится не "only the executable name", а полностью не говоря уже о разделителях, а awk распознает substr. Равно как и cut присутствует в любом коробке на busybox. Все зависит от цели.
anode
Вариантов, как всегда, много, но,например, в моем роутере команда ps имеет только один параметр w, соответственно и команда выводится не "only the executable name", а полностью не говоря уже о разделителях, а awk распознает substr. Равно как и cut присутствует в любом коробке на busybox.
согласен, вариант с substr довольно неплох, но раз уже пошла такая пьянка то то есть еще вариант, это немного переделанный(модернизированный) вариант ТС-а
grayich
в баш конечно удобно, этакий split()
arr=($(ps -eo pid,size,comm --sort -size --no-headers|head -1))
echo "p1=${arr[0]} p2=${arr[1]} p3=${arr[2]}"
где будет достаточно просто поработать с массивом (${arr[@]:2}):
arr=($(ps -eo pid,size,comm --sort -size --no-headers|head -1))
p1=${arr[0]}; p2=${arr[1]}; p3=${arr[@]:2}

anode
Все зависит от цели.
не только от цели но и от возможностей, как упоминалось выше в системе может не присутствовать необходимого инструмента или он будет работать немного по другому
 
Зарегистрироваться или войдите чтобы оставить сообщение.