Пожалуйста, помогите мне расшифровать эту строку кода сценария bash

Что это значит?

  h2t=$((exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) \
            || which html2text || which cat) |tail -n 1)

В порядке, h2t=... означает, что он устанавливает переменную.

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

Конечно, над строкой кода есть 15-строчный блок комментариев, который объясняет намерение. К сожалению, комментарий в юникодной версии древнего шумера, и я не могу его интерпретировать.

** Только шучу! Там нет комментариев.

Приложение: это от https://github.com/micha/resty/blob/master/resty

2 ответа

Решение

twalberg в комментарии к моему ответу заметил это. Оказывается внешний $() назначает командную строку, в зависимости от доступности различных инструментов, которые могут быть в состоянии преобразовать HTML в текст.

Следовательно h2t содержит либо lynx -stdin -dump командной строки, или если это не удалось (т.е. lynx недоступен), html2text или в крайнем случае cat, Команды для последних двух поступают из which заклинания, тот для первого из echo,


Он конвертирует HTML в текст из стандартного ввода.

Давайте разделим это.

  • exec 2>&- устанавливает перенаправление в подоболочку (закрывается stderrIIRC)
  • следующая суб-оболочка пытается увидеть, установлен ли Lynx, и запускает его, принимая данные от stdin,
  • другие части после || не имеет большого смысла, потому что они только оценивают, html2text а также cat установлены, но не запускайте их
  • затем мы получаем последнюю строку из этой первой подоболочки

Сотрите это. Так как это echo это ничего не делает. Похоже, прототипирование для меня.

Разобрав его, чтобы сделать его более читабельным:

$(
    exec 2>&-
      (
        which lynx >/dev/null &&
        echo lynx -stdin -dump
      ) ||
    which html2text ||
    which cat
  ) |
  tail -n 1
)

Я не помню точное правило для устранения неоднозначности синтаксиса, но оно должно быть проанализировано следующим образом:

h2t=$(
       (exec 2>&-; (which lynx >/dev/null && echo lynx -stdin -dump) ||
         which html2text ||
         which cat) |
       tail -n 1
     )

Другими словами, подстановка команд, состоящая из подоболочки, переданной в tail, Подоболочка используется, чтобы обеспечить "область" для exec команда, после которой другой подоболочек запускает список, чьи 3 команды разделены || оператор.

Другие вопросы по тегам