Почему сценарий Bash по-прежнему выводит на стандартный вывод, даже если я перенаправляю его на стандартный вывод?

Я не думаю, что idnимеет какие-либо переключатели для пропуска недопустимых строк вместо выхода с ошибкой, поэтому единственный оставшийся вариант — перезапустить его после ожидаемой ошибки:

idn_skip(){
    while ! error=$(idn 2>&1 >&3); do
        case $error in *'Punycode failed'*|*'Output would be too large'*) ;; # restart
        *) break;;
        esac
    done 3>&1
}

idn_skip < domain_list

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

Вместо того, чтобы пытаться преодолеть idnограничения, я бы посоветовал использовать Net::LibIDNпакет perl(apt-get install libnet-libidn-perlв Debian )и написать все это на Perl.

0
22.10.2021, 13:42
2 ответа

Чтобы сценарий не отправлял стандартный поток ошибок на терминал, необходимо перенаправить его на /dev/nullили в файл.

Это можно сделать, запустив сценарий со стандартным потоком ошибок, перенаправленным в командной строке, или позволив самому сценарию перенаправить свой поток ошибок.

Чтобы перенаправить поток ошибок на /dev/nullв командной строке, вызовите скрипт, используя

./my_script 2>/dev/null

Если вы хотите, чтобы скрипт автоматически отбрасывал свой стандартный поток ошибок, перенаправьте поток на /dev/nullвнутри скрипта:

#!/bin/bash

# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null

echo 'This should not be visible.' >&2
echo 'This should be visible.'

Измените /dev/nullна путь к файлу, чтобы вместо этого передавать диагностические данные в этот файл.

На стандартный поток вывода не влияет перенаправление стандартного потока ошибок на /dev/nullили в файл.

Обратите внимание, что скрипт обычно не должен завершаться с помощью exit 0.

3
22.10.2021, 15:35

Чтобы заставить этот конкретный скрипт отказаться от своего стандартного вывода:

Дан скрипт:

date
date -r /var/empty/foo

отредактируйте его, чтобы он стал групповой командой . Группирование команд вместе таким образом позволяет обрабатывать стандартный вывод и стандартные потоки ошибок объединенных команд (, перенаправлять, передавать по конвейеру, отбрасывать и т. д. ), как если бы группа была логически одной командой.

Например:

{
date
date -r /var/empty/foo
} > /dev/null

отменит стандартный вывод, но не изменит маршрутизацию стандартного потока ошибок.

Следующий скрипт:

{
date
date -r /var/empty/foo
} > /dev/null 2>&1

перенаправит свой стандартный вывод на /dev/null, а затем перенаправит свою стандартную ошибку на свой стандартный вывод, отбрасывая, таким образом, как stderr, так и stdout. Этот конкретный синтаксис эквивалентен:

{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null
1
22.10.2021, 15:39

Теги

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