less останавливает мой сценарий; почему так и как избежать?

@rush использование sedне работало в моей оболочке, поэтому я пошел по этому пути

grep -Poh '(?<=login":")[^"]*' json* | sort | uniq -c | awk  -v OFS=': ' 'BEGIN{print "{"}{print $2, $1}END{print"}"}' | sed -E 's/([0-9])$/\1,/g;s/:/\":/g;s/^([^{}])/\"\1/g'

Множественное число sedможно изменить, если ваша оболочка позволяет экранировать "и печатать их в операторе awk.

grep -Poh '(?<=login":")[^"]*' json* | sort | uniq -c | awk  -v OFS=': ' 'BEGIN{print "{"}{print \"$2\", $1}END{print"}"}' | sed -E 's/([0-9])$/\1,/g'

У меня в оболочке awkподавился \"во втором скрипте. Не уверен, почему, но уверен, что кто-то там скажет мне.

Я также пробовал jq, но он задыхался от файлов json. Синтаксическая ошибка

.
"this":"is' #is written so I edited these to
"this":"is"

Также jqне понравилась конструкция

{"a":"strange"} # so I also edited these to
b: {"a":"strange"}

Если исходные файлы должны соответствовать внесенным изменениям, тогда jqработает

jq '.login' json* | sort | uniq -c | awk -v OFS=': ' 'BEGIN{print "{"}{print $2, $1}END{print"}"}' | sed -E 's/([0-9])$/\1,/g'
1
20.05.2020, 16:38
1 ответ

Причина, по которой это происходит, заключается в том, что включение управления заданиями(set -m)приводит не только к группированию процессов, но и к механизму обработки «передних» и «фоновых» заданий. Этот «механизм» подразумевает, что каждая команда, выполняемая по очереди, пока включено управление заданиями, становится группой процессов переднего плана.

Таким образом, вкратце, когда эта вспомогательная -оболочка (в левой части вашего конвейера )включает управление заданиями, она буквально крадет терминал из всего конвейера, в котором он был до этого и который, в вашем например, включает процесс less, что делает его фоновым и, таким образом, не позволяет больше использовать терминал. Поэтому он останавливается, потому что lessпродолжает обращаться к терминалу.

Выдав fg, вы возвращаете терминал всему конвейеру, следовательно, less, и все заканчивается хорошо. Если вы не запускаете дополнительные команды в рамках задания -, управляющего оболочкой sub -, потому что в этом случае каждая дополнительная команда снова захватит терминал.

Один из способов обойти это — просто запустить вашу работу -контролируемую подпрограмму -подпрограмму -оболочку в фоновом режиме:

( set -m; (
        $1
    ) & set +m ) | 
    (
        $2
    )

У вас будет команда, выраженная $1, которая будет выполняться в отдельной группе процессов, как вы пожелаете, в то время как фоновый режим предотвращает кражу терминала, таким образом оставляя его конвейеру и, следовательно, $2.

Естественно, это требует, чтобы команда в $1не хотела читать сам терминал, иначе он будет остановлен, как только попытается это сделать.

Кроме того, подобно тому, как я сказал выше,любое дополнительное задание -контролируемое подчиненное -подчиненное -оболочка, которое вы, возможно, захотите добавить, потребует такой же «фоновой» обработки до тех пор, пока вы set +m, в противном случае каждое дополнительное задание -контролируемое подчиненное -оболочка sub -снова украдет терминал.

Тем не менее, если все, для чего вам нужна группировка процессов, — это уничтожение процессов, вы можете рассмотреть возможность использования pkillдля их нацеливания. Например, pkill -Pотправит сигнал процессам, чей родительский является указанным PID. Таким образом, вы можете ориентироваться на всех дочерних (, но не на старших -дочерних )вашего подпроцесса -, просто зная PID подпроцесса -.

1
28.04.2021, 23:13

Теги

Похожие вопросы