Вы можете использовать сигнал STOP
, чтобы приостановить процесс, и CONT
, чтобы возобновить его выполнение:
kill -STOP ${PID}
kill -CONT ${PID}
Речь идет о разделителе полей .
Вам необходимо определить разделитель записей , чтобы поместить каждую строку в одну. Используйте ORS
параметр :
ls -l /dev | grep tty | awk 'BEGIN { ORS=" " }; {print $3}'
Без него вывод будет:
root
root
root
etc...
И когда вы определяете ALL_TTY_OWNERS_STR
переменную, вы помещаете только первую строку вывода в первый элемент массива. Из-за этого ваш массив будет содержать только один элемент, и это именно то, что вы получаете
Разделителем полей по умолчанию для вывода является пробел. Но разделителем записей является новая строка. ALL_TTY_OWNERS_STR
содержит набор символов root
, разделенных символами новой строки:
$ printf "%q\n" "$ALL_TTY_OWNERS_STR"
$'root\nroot\nroot\n....
И read
по умолчанию читаются до первой новой строки.
Если вам просто нужны все пользователи из ALL_TTY_OWNERS_ARRAY
, может быть проще сделать что-то вроде:
ALL_TTY_OWNERS_ARRAY=( $(stat -c '%U' /dev/*tty*) )
Если вы не заключите переменную в кавычки после <<<
, новые строки станут ожидаемыми пробелами, и результат будет в одной строке:
read -r -a ALL_TTY_OWNERS_ARRAY <<< $ALL_TTY_OWNERS_STR
read -a array
считывает все слова из одной записи в array
.
Если вы хотите прочитать все слова из всего ввода, используйте разделитель записей, который не встречается во вводе, например, -d ''
, который использует символ NUL в качестве разделителя записи, или-d :
(как :
не может встречаться в имени пользователя ).
IFS=$'\n' read -rd '' -a array < <(ls -Ll /dev | awk '/tty/{print $3}')
(здесь используется -L
, чтобы для символических ссылок возвращалось право собственности на устройства, а не символическая ссылка ).
Или используйте readarray
для каждой строки ввода, который будет сохранен в массиве.
readarray -t array < <(ls -Ll /dev | awk '/tty/{print $3}')
Или вы можете использовать оператор split+glob:
set -o noglob # disable glob part
IFS=$'\n' # split on newline
array=($(ls -Ll /dev | awk '/tty/{print $3}')) # invoke split+glob by leaving
# the $(...) unquoted.
Обратите внимание, что tty
ищется во всем выводе ls -Ll
, включая имя пользователя и группы, имя файла (и цель символической ссылки, если вы опустите-L
). Если вы хотите учитывать только имя файла, вы можете сделать
ls -Lld /dev/*tty* | awk '{print $3}'
вместо этого.
С помощью zsh
можно сделать:
zmodload zsh/stat
stat -s -A array +uid /dev/*tty*
(что было бы полезно также работать с именами пользователей, содержащими пробелы ).