Существует несколько опций. Придерживаясь решения для цикличного выполнения, можно использовать read
считать строку за один раз в переменную:
find . -name "*.pdf" | while IFS= read -r x
do
echo pathname "$x"
done
Можно также использовать xargs -0
и find -print0
обработать любой вид специальных символов:
find . -name "*.pdf" -print0 | xargs -0 -L1 echo pathname
Если у вас есть / proc
на вашем конкретном варианте * nix, вы можете вместо этого попытаться вытянуть из него нужные данные. Я думаю, что это может быть немного разумнее, чем пытаться продираться через утомительный синтаксический анализ вывода, предназначенного для чтения человеком.
Например, чтобы получить идентификатор пользователя, запустившего процесс tomcat
, вы можете:
stat -c'%u' /proc/$(pgrep tomcat)/
Полагаться на доступность (и стандартизацию) / proc
может быть даже больше хлопот в зависимости от вашего конкретного приложения / среды / ... Думаю, решать вам.
Передайте параметр -o
в ps
, чтобы управлять тем, какие поля он выводит. Если вы добавите знак =
после всех полей, строка заголовка будет опущена.
Используйте -e
вместо ax
, чтобы придерживаться стандартных функций (это будет работать с любыми не-антикварными unix).
Ваш фильтр с grep
не является надежным. Например, если вы запустите эту команду из сценария с именем look-for-tomcat
, то ваш сценарий также будет сопоставлен. Вот более надежный способ поиска процесса JVM с аргументом org.apache.catalina.startup.Bootstrap
.
ps -e -o user=,args= | awk '
$2 ~ /java$/ && / org\.apache\.catalina\.startup\.Bootstrap($| ) {
print "user name: ", $1;
if (match($0, / -javaagent:[^ ]* /)) print substr($0, RSTART+1, RSTART+RLENGTH-2);
# etc.
}'
Еще лучше было бы записывать PID процесса tomcat в файл (например, /var/run/tomcat.pid
) при его запуске.