Поскольку запрошенный вывод, по-видимому, имеет одну строку вывода для каждой строки ввода, где строка просто копируется, если она совпадает, и заменяется, если нет, есть лучшие способы сделать это, чем чтение файла 5 раз и распечатать строки в том порядке, в котором они находятся в файле поиска _kwd.sh, а не во входном файле.
Вместо этого вы должны обрабатывать входной файл по одной строке за раз. Есть много инструментов, которые могут это сделать. Например
#!/bin/sh
sed -e '/kwd1/{p;d}
/kwd2/{p;d}
/kwd3/{p;d}
/kwd4/{p;d}
/kwd5/{p;d}
s/.*/string/' search_file.txt
в котором говорится, что для каждого совпадающего ключевого слова распечатайте строку, затем отбросьте ее и перейдите к следующей строке. Если он проходит через все ключевые слова и ни одно из них не соответствует, измените строку на строку (и затем неявно напечатайте ее ).
Вы можете использовать awk
с чем-то вроде этого
#!/bin/sh
awk '{ if (/kwd1|kwd2|kwd3|kwd4|kwd5/) { print } else {print "string" }}' search+file.txt
У вас может быть чистая реализация оболочки
#!/bin/sh
while read -r line
do
case "$line" in
(*"kwd1"*|*"kwd2"*|*"kwd3"*|*"kwd4"*|*"kwd5"*) printf '%s\n' "$line" ;;
(*) printf '%s\n' "string" ;;
esac
done < search_file.txt
Вы также можете использовать perl, ruby, python.
Просто запустите Quodlibet в текущей оболочке, а не в подпроцессе -:
#!/bin/bash
trap "exit" INT TERM ERR
trap "kill 0" EXIT
(sleep 2 && conky) &
quodlibet
[обновление] Вы упомянули, что хотите запустить этот скрипт из файла .desktop
в графической среде. @fra -san сообщил мне, что каждый процесс, запущенный таким образом, скорее всего, унаследует группу процессов своего родителя, и, как следствие, kill 0
убьет этот процесс запуска и (потенциально )все его процессы. началось. Это, конечно, не то, что вы хотите.
Решение этой проблемы состоит в том, чтобы запустить ваш скрипт с setsid
, чтобы создать новую группу процессов, посвященную ему:
setsid /path/to/script.sh