В данном случае, если Ваш mail
поддержки -E
опция, просто используйте его. В общем случае можно попытаться считать один символ; если существует один, запустите команду постобработки и подайте ее что символ от остальной части файла.
pipe_if_not_empty () {
a=$(dd bs=1 count=1 2>/dev/null; echo .) # read at most one character
if [ "$a" != "." ]; then # if there were two characters,
{ printf %s "${a%.}"; # then output the first character
cat; } | # and the rest of the input
"$@" # into the specified program
fi
}
mailq | egrep 'rejected|refused' -A 5 -B 5 |
pipe_if_not_empty mail -s 'dd' email@email
Отметьте полезное использование cat
. Добавление echo .
делает эту функциональную работу, даже если первый символ во входе является новой строкой (помните что $(…)
создайте новые строки терминала полос).
С большинством оболочек (что-либо кроме zsh, насколько я знаю), если файл начинается с нулевого символа, этот код будет полагать, что это пусто. Фиксация, которую оставляют как осуществление для читателя. (Подсказка: использовать od
в первой подоболочке и printf
распечатать первый байт.) (Решение: Как проверить, пуст ли канал), Вы могли бы столкнуться с той же проблемой, если файл начинается с байта, который не является допустимым символом в текущей локали; с этим легче зафиксировать путем выполнения этого кода LC_ALL=C
.
В то время как я не знаком с каждой функцией Bash, я не полагаю, что это - встроенная функция оболочки Bash. Я не мог найти эту функцию в соответствующих разделах руководства Bash.
Вы можете мостить что-то вместе использование trap
. От help trap
:
Прерывание сигнализирует и другие события.
Определяет и активирует обработчики, которые будут выполнены, когда оболочка получает сигналы или другие условия.
Таким образом при помощи команды:
$ trap my_function ERR
Я могу гарантировать это my_function
назван каждый раз, когда команда перестала работать. my_function
могла быть функция, которая анализирует предыдущую команду, ища известные расширения и называя соответствующую команду на основе того расширения.
В зависимости от Вашего интереса, пишущий такую функцию может быть более или менее интересным, чем перемещение в оболочку z.
Если Вы находитесь на Linux, Вы могли бы попытаться настроить binfmt разное.
Вы могли использовать рыбу вместо Bash. Это имеет функциональность, которую Вы ищете и партии, интересные больше.
Для Вашего примера. Просто введите
open manual.pdf
и это открывает файл PDF со связанной программой.
openvt
который "запускает программу на новом виртуальном терминале". на Linux это было бы xdg-open
или gnome-open
.
– akira
07.02.2011, 17:13