Строковая утилита Popplerpdfinfo command -предоставит вам номер страницы, позицию и имя для всех именованных мест назначения в PDF-файле. Вам нужна версия Poppler не ниже 0.58.
$ pdfinfo -dests input.pdf
Page Destination Name
1 [ XYZ null null null ] "F1"
1 [ XYZ 122 458 null ] "G1.1500945"
1 [ XYZ 79 107 null ] "G1.1500953"
1 [ XYZ 79 81 null ] "G1.1500954"
1 [ XYZ null null null ] "P.1"
2 [ XYZ null null null ] "L1"
2 [ XYZ null null null ] "P.2"
(...)
Тяжеловесный способ сделать это использует expect
#!/usr/bin/env expect
spawn node server.js
set timeout -1
expect {{"listening":3000}}
# now you can process all the crap, but in Expect
interact
При использовании bash вам не нужно обрабатывать файл foo в bash. Как насчет
#!/usr/bin/env bash
node server.js &> server.out &
# busy wait
while true; do
grep -q '{"listening":3000}' server.out && break
sleep 1
done
# continue crap processing
Возможно, вы могли бы демонизировать сервер, пока вы на нем:
node server.js </dev/null &> server.out &
disown $!
Ответ Гленна с expect
кажется мне отличным общим решением.
Если вам нужен более простой способ или вы не хотите/не можете ожидать установки, вот уменьшенная версия в bash:
#!/usr/bin/env bash
process() {
# do your stuff
echo ok
}
node server.js | ( grep -L '{"listening":3000}' ; process ) &
Я использую параметр grep -L (-l тоже будет работать нормально, но будет производить вывод ), заставляя его возвращаться, как только будет найдено совпадение. Затем управление передается функции процесса,и вы даже можете продолжить чтение вывода, если хотите.
Добавьте wait
в конце, если вы не хотите, чтобы скрипт возвращался до тех пор, пока сервер не выключится.