Я хочу, щоб мої сценарії оболонки виходили з ладу щоразу, коли команда, виконана з ними, відмовляється.
Як правило, я роблю це з:
set -e
set -o pipefail
(зазвичай я set -u
також додаю )
Вся справа в тому, що жоден з перерахованих вище не працює з заміщенням процесу. Цей код друкує "нормально" і виходить із кодом повернення = 0, хоча я б хотів, щоб він не зміг:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Чи є щось еквівалентне "pipefail", але для заміни процесу? Будь-який інший спосіб передати команді вихід команд так, як це були файли, але викликати помилку, коли будь-яка з цих програм виходить з ладу?
Рішення бідного чоловіка було б виявити, якщо ці команди пишуть у stderr (але деякі команди записують у stderr в успішних сценаріях).
Іншим рішенням, суміснішим з позицій, буде використання названих труб, але мені потрібно запустити ці команди-що-використовувати-процес-підміни як однолінійки, побудовані на льоту з компільованого коду, і створення названих труб ускладнить справи (додаткові команди, помилка відключення для видалення їх тощо)
$$
підміна для мене не працює, оскільки заміна команди ths не виконується, оскільки команда, яка використовує підстановку процесу, виконується всередині командного конвеєра, який породжується з коду "не оболонки" (python). Ймовірно, я повинен створити підпроцес в python і передавати їх програмно.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Ця команда буде висіти , поки читач не відкривається ,pipe
тому що це оболонка , яка робитьopen()
і тому , як тільки є читач наpipe
пФе посилання дляpipe
İŞrm
«D , а потімcat
копіює вхідний_файл до дескриптора оболонки для цієї труби. І все одно, якщо ви хочете поширити помилку з підпроцесу процесу: <( ! : || kill -2 "$$")