Почему делает 'должностное лицо 2> &1', перестали работать в этом сценарии оболочки Bourne?

[ -f "$myregexp" ] или [[ -f $myregexp ]] тесты, если существует файл, названный точно $myregexp. (Обратите внимание с одиночными скобками, необходимость в двойных кавычках.)

Если Вы хотите протестировать на существование файлов, соответствующих шаблону шарика, нет никакого прямого пути. Необходимо сделать это на двух шагах: сначала генерируйте список соответствий, затем протестируйте, если тот список пуст.

a=( ~(Ni)*.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

Это использует много ksh-определенных функций:

  • ~(N) префикс для генерации пустого списка, если там не идет ни в какое сравнение;
  • ~(i) префикс, чтобы сделать нечувствительное к регистру соответствие;
  • @(foo|bar) синтаксис шарика для соответствия foo или bar

Вот эквивалентный удар. В ударе Вы получаете случай пустое расширение для несоответствия шарикам и нечувствительности к регистру от опций; extglob для @(foo|bar) синтаксис и другие ksh расширения шарика.

shopt -s nocaseglob nullglob extglob
a=( *.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

Вот zsh эквивалент. extended_glob опция необходима для (#i) префикс для нечувствительного к регистру соответствия. (N) спецификатор шарика указывает на пустое расширение для несоответствия шарикам.

setopt extended_glob
a=( (#i)*.(tgz|tar.gz)(N) )
if [[ ${#a} -ne 0 ]]; then …
7
31.07.2012, 21:07
2 ответа

Ваш сценарий не перестал работать - он работает просто великолепно. Ваше понимание корректно в этом exec >logfile; exec 2>&1 перенаправления и стандартный вывод и стандартная погрешность к logfile. Так, необходимо смотреть в файле журнала и не терминале для вывода и ошибки. При выполнении тех перенаправлений непосредственно в текущей оболочке похоже, что оболочка заморозилась, потому что Вы отослали весь вывод от своего терминала.

Обратите внимание что вывод в xtrace (set -x) опция также переходит к стандартной погрешности, которая всегда является дескриптором файла 2..., который Вы отослали к файлу журнала. Необходимо найти остальную часть его после exec 2>&1 там.

16
27.01.2020, 20:14
  • 1
    , Спасибо! И если я открываю новое окно и делаю a tail -f /var/tmp/logfile.39918 Я вижу все, что я ввожу в старом окне. Умный прием! –  Stefan Lasiewski 31.07.2012, 22:35
  • 2
    "... отправляет и стандартный вывод и стандартный вход к logfile..." должен быть "стандартный вывод и стандартная погрешность". Я отредактирую для создания исправления. –  Kevin Fegan 09.02.2014, 16:48

Эта форма должностного лица (т.е. без команды) используется для перенаправления всего последующего вывода от текущего интерпретатора оболочки.

от встроенной справки удара:

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.
    [...]

Я использую exec &> logfile перенаправить stdout и stderr одновременно. например, большая часть моего резервного копирования и rsync сценариев обертки (или любой сценарий, который производит большой вывод, который я мог бы хотеть исследовать подробно позже) запускаются с чего-то вроде этого:

BNAME=$(basename "$0" .sh)
LOGFILE="/tmp/$BNAME.log"
savelog "$LOGFILE"
exec &> "$LOGFILE"

Я затем запускаю скрипт от крона, или в фоновом режиме и использование tail -F для наблюдения файла журнала как, сценария работает. savelog позволяет мне сохранить вывод от последних 7 выполнений (7 по умолчанию, savelog -c может использоваться для изменения этого).

4
27.01.2020, 20:14
  • 1
    Вопрос конкретно предназначается для Оболочки Bourne. Граница не имеет &> оператор, и при этом заключение в кавычки не bash ужасно полезная страница справочника. Часть о кроне не важна. –  jw013 01.08.2012, 02:23
  • 2
    Это все еще ясно ответило на его первый вопрос, 'Кто такое должностное лицо 2> &1 предполагаемый сделать?' которому еще на самом деле не ответили. При принятии разумной способности понять, обобщите и экстраполируйте, не заслуживает-1. Я склонен предпочитать давать общее объяснение вместо просто волшебства грузового культа к конкретному вопросу. BTW, это была справка удара, не страница справочника удара... это просто, оказалось, было самой удобной и сжатой документацией для вручения, и важный момент о вступлении в силу в текущей оболочке относится ко всем версиям sh. –  cas 01.08.2012, 02:33
  • 3
    я не вижу части в Вашем ответе, который конкретно объясняет что exec 2>&1 ? Я обычно downvote ответы, которые поощряют неправильные представления, или явно или неявно (в Вашем случае, подразумевая sh = bash), потому что не каждый человек, который читает Ваш ответ в будущем, будет знать различие. удар основан на sh, но на практике существует много различий (как &>: помещение этого в сценарии Оболочки Bourne, вероятно, повредит его). Кроме того, ни одна из тех опций это bash exec принимает, вероятно, будут допустимы. –  jw013 01.08.2012, 17:28
  • 4
    Мое первое предложение объясняет это. Как делает окончательный приговор в выводе справки удара. Остаток является примером того, почему и как такая функция могла быть использована - почему и как, обычно будучи опущенным из страниц справочника и другого ссылочного материала. –  cas 02.08.2012, 01:24
  • 5
    Q. "Кто такое должностное лицо 2> &1 предполагаемый сделать?". A. "Эта форма должностного лица (т.е. без команды) привыкла к [...]". Нет никакого беспорядка между ударом и sh в том предложении. Это верно для всех вариантов sh. Вы проигнорировали его первый вопрос и ответили на его секунду, я проигнорировал его секунду и отвеченный на его первое. Вы судите мой ответ по вопросу, на который Вы ответили, не по тому, на который я ответил. –  cas 02.08.2012, 02:13

Теги

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