Я хочу, чтобы мои сценарии оболочки не работали всякий раз, когда выполняемая с ними команда не выполняется
Обычно я делаю это с:
set -e
set -o pipefail
(как правило, я добавляю set -u
также)
Дело в том, что ничего из вышеперечисленного не работает с заменой процесса. Этот код выводит «ok» и завершается с кодом возврата = 0, в то время как я хотел бы, чтобы он потерпел неудачу:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Есть ли что-то эквивалентное "pipefail", кроме как для замены процесса? Любой другой способ передать команде вывод команд, как будто они были файлами, но выдавать ошибку всякий раз, когда любая из этих программ дает сбой?
Решение плохого человека было бы определить, пишут ли эти команды в stderr (но некоторые команды пишут в stderr в успешных сценариях).
Другим решением, более совместимым с posix, было бы использование именованных каналов, но мне нужно использовать эти команды, которые используют подстановку процессов, так как oneliners создаются на лету из скомпилированного кода, а создание именованных каналов усложнит ситуацию (дополнительные команды, ошибка перехвата для удаляя их и т. д.)
$$
замена не работает для меня, так как эта подстановка команд не выполняется, так как команда, использующая подстановку процессов, выполняется внутри конвейера команд, порожденного из кода «не оболочки» (python). Вероятно, я должен создать подпроцесс в Python и программно передать их.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Эта команда будет зависать до тех пор, пока не откроется читатель,pipe
потому что это оболочка, которая выполняет операцию,open()
и так, как только вpipe
ссылке fs есть читатель дляpipe
isrm
'd, а затемcat
копирует infile в дескриптор оболочки для этого канала. И вообще, если вы хотите распространить ошибку из подпрограммы процесса, то сделайте: <( ! : || kill -2 "$$")