Как вызвать выход из скрипта, получающего данные через канал, из другой программы?

awk раствор:

awk 'BEGIN{ FS=OFS="," }$2 ~ /^"arn:aws:iam:/{ $2 = ","$2 }1' file.csv
  • $2 ~ /^"arn:aws:iam:/-, если второе поле $2начинается с"arn:aws:iam:
  • $2 = ","$2-добавьте ко второму значению поля,

Выход:

"ADFS-Administrators","Administrator-Access","arn:aws:iam::279052847476:saml-provider/companyADFS"
"ADFS-amtest-ro",,"arn:aws:iam::279052847476:saml-provider/companyADFS"
"AWSAccCorpAdmin",,"arn:aws:iam::279052847476:saml-provider/LastPass"
"AWScompanyCorpAdmin",,"arn:aws:iam::279052847476:saml-provider/LastPass"
"AWScompanyCorpPowerUser",,"arn:aws:iam::279052847476:saml-provider/LastPass"
"flowlogsRole","oneClick_flowlogsRole_1495032428381",
"companyDevShutdownEC2Instaces","oneClick_lambda_basic_execution_1516271285849",
"companySAMLUser",,"arn:aws:iam::279052847476:saml-provider/companyAzureAD"
"lambda_stop_rundeck_instance","oneClick_lambda_basic_execution_1519651160794",
"OneLoginAdmin",,"arn:aws:iam::279052847476:saml-provider/OneLoginAdmin"
"OneLoginDev",,"arn:aws:iam::279052847476:saml-provider/OneLoginDev"
"vmimport","vmimport",
"workspaces_DefaultRole","SkyLightServiceAccess",
3
11.12.2019, 14:28
1 ответ

Причина, по которой ваш конвейер не завершается, заключается в том, что оператор exit 1завершает только подоболочку правой стороны.

После того, как правая сторона имеет выход, команда date, которую вы используете для генерации данных, начнет давать сбой, поскольку она не может никуда записать свой вывод (она будет уничтожена сигналом PIPE)]. Вы не проверяете статус выхода date, поэтому не видите этого.

Переписать левую часть как

(
    while true; do
        if ! date; then
            exit    # or: break
        fi
        sleep 1
    done
)

или как

(
    while date; do
        sleep 1
    done
)

заставит конвейер в целом вести себя так, как вы ожидаете.

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

Это ошибка в программе, которая создает данные.

Как это обойти?

Один из способов — использовать именованный канал. Это позволит вам получить PID процесса, производящего данные -, который впоследствии можно будет использовать для его уничтожения :

.
#!/bin/bash

rm -f data.pipe
mkfifo data.pipe

( while true; do date; sleep 1; done ) >data.pipe & pid=$!

(
    for ((i = 0; i < 3; i++)); do
        read -r line
        printf 'LINE: %s\n' "$line"
        sleep 1
    done
    kill "$pid"
    exit 1
) <data.pipe

Если программа игнорирует сигнал PIPE, вполне возможно, что она игнорирует и другие сигналы, поэтому вам придется сначала поэкспериментировать с отправкой стандартного TERM, а если это не сработает, попробуйте INTи т. д.

1
27.01.2020, 21:29

Теги

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