Выполните файл в приложении на основе расширения файла в ударе

В данном случае, если Ваш 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.

6
13.04.2017, 15:36
3 ответа

В то время как я не знаком с каждой функцией Bash, я не полагаю, что это - встроенная функция оболочки Bash. Я не мог найти эту функцию в соответствующих разделах руководства Bash.

Вы можете мостить что-то вместе использование trap. От help trap:

Прерывание сигнализирует и другие события.

Определяет и активирует обработчики, которые будут выполнены, когда оболочка получает сигналы или другие условия.

Таким образом при помощи команды:

$ trap my_function ERR

Я могу гарантировать это my_function назван каждый раз, когда команда перестала работать. my_function могла быть функция, которая анализирует предыдущую команду, ища известные расширения и называя соответствующую команду на основе того расширения.

В зависимости от Вашего интереса, пишущий такую функцию может быть более или менее интересным, чем перемещение в оболочку z.

2
27.01.2020, 20:28
  • 1
    Ну, я думаю с помощью этого подхода с xdg-открытым, на который указывает @akira из-за ответа @NES, способ пойти. До них просто действительно xdg-открывается псевдоним, хорошо мне. –  Somebody still uses you MS-DOS 10.02.2011, 17:50

Если Вы находитесь на Linux, Вы могли бы попытаться настроить binfmt разное.

3
27.01.2020, 20:28

Вы могли использовать рыбу вместо Bash. Это имеет функциональность, которую Вы ищете и партии, интересные больше.

Для Вашего примера. Просто введите

open manual.pdf

и это открывает файл PDF со связанной программой.

1
27.01.2020, 20:28
  • 1
    так Ваш ответ является "нет". плюс: Ваше 'открытое', скорее всего, только работает над Mac в способе, которым Вы думаете, что он работает. на Linux это - символьная ссылка на openvt который "запускает программу на новом виртуальном терминале". на Linux это было бы xdg-open или gnome-open. –  akira 07.02.2011, 17:13
  • 2
    @akira: Действительно, использование xdg-открытых работ в моей машине Ubuntu. Я думаю, что просто создам "открытый" псевдоним для xdg-открытий. –  Somebody still uses you MS-DOS 10.02.2011, 17:47

Теги

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