Я не думаю, что 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.
Чтобы сценарий не отправлял стандартный поток ошибок на терминал, необходимо перенаправить его на /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
.
Чтобы заставить этот конкретный скрипт отказаться от своего стандартного вывода:
Дан скрипт:
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