Описание тега s3ql
Я бы сделал потяжелее использовать перенаправление ввода-вывода:
#!/бин/Баш
[[ $1 ]] && [[ ! -Ф $1 ]] && файла echo "$1 дне" && выход 1
[[ $1 ]] && метод exec 3<$1 || в exec 3<&0
[[ $2 ]] && старпома 4>$2 || выполнить 4>&1
fgrep -V "как вещи" <&3 >&4
Объяснение
[[ $1 ]] && [[ ! -Ф $1 ]] && файла echo "$1 дне" && выход 1
Проверить, если входной файл был указан в качестве аргумента командной строки, и если файл существует.
[[ $1 ]] && метод exec 3<$1 || в exec 3<&0
Если
$1
, т. е. входной файл не указан, указанный файл будет открыт в файл с дескриптором3
, в противном случаестандартный ввод,
дублируются в файл с дескриптором3
.[[ $2 ]] && старпома 4>$2 || выполнить 4>&1
Аналогично, если
$2
, т. е. выходной файл не указан, указанный файл будет открыт в файл с дескриптором4
, в противном случаестандартный вывод
дублируется в файл с дескриптором4
.fgrep -V "как вещи" <&3 >&4
Наконец
fgrep
вызывается, направив егокак stdin
иstdout, в
установленным ранее файловые дескрипторы3
и4
соответственно.
Открытие стандартного ввода и вывода
Если вы предпочитаете не открывать промежуточных файловых дескрипторов, в качестве альтернативы можно заменить файл дескрипторов, соответствующих стандартный ввод
и стандартный вывод
напрямую с заданными входными и выходными файлами:
#!/бин/Баш
[[ $1 ]] && [[ ! -Ф $1 ]] && файла echo "$1 дне" && выход 1
[[ $1 ]] && exec для 0<$1
[[ $2 ]] && Метод exec 1>$2
fgrep -в "хлам"
Недостаток такого подхода заключается в том, что вы теряете способность различать выход из самого скрипта из вывода команды, которая является целевой для перенаправления. В изначальном подходе, вы можете направить вывод скрипта в неизмененном стандартного ввода
и стандартного вывода
, который, в свою очередь, могли быть перенаправлены в вызывающий скрипт. Указанные входной и выходной файлы могут все еще быть доступны через соответствующие файловые дескрипторы, которые отличаются от сценарий стандартный ввод
и стандартный вывод
.