[ -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 …
Ваш сценарий не перестал работать - он работает просто великолепно. Ваше понимание корректно в этом exec >logfile; exec 2>&1
перенаправления и стандартный вывод и стандартная погрешность к logfile
. Так, необходимо смотреть в файле журнала и не терминале для вывода и ошибки. При выполнении тех перенаправлений непосредственно в текущей оболочке похоже, что оболочка заморозилась, потому что Вы отослали весь вывод от своего терминала.
Обратите внимание что вывод в xtrace
(set -x
) опция также переходит к стандартной погрешности, которая всегда является дескриптором файла 2..., который Вы отослали к файлу журнала. Необходимо найти остальную часть его после exec 2>&1
там.
Эта форма должностного лица (т.е. без команды) используется для перенаправления всего последующего вывода от текущего интерпретатора оболочки.
от встроенной справки удара:
$ 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
может использоваться для изменения этого).
&>
оператор, и при этом заключение в кавычки не bash
ужасно полезная страница справочника. Часть о кроне не важна.
– jw013
01.08.2012, 02:23
exec 2>&1
? Я обычно downvote ответы, которые поощряют неправильные представления, или явно или неявно (в Вашем случае, подразумевая sh
= bash
), потому что не каждый человек, который читает Ваш ответ в будущем, будет знать различие. удар основан на sh, но на практике существует много различий (как &>
: помещение этого в сценарии Оболочки Bourne, вероятно, повредит его). Кроме того, ни одна из тех опций это bash
exec
принимает, вероятно, будут допустимы.
– jw013
01.08.2012, 17:28
tail -f /var/tmp/logfile.39918
Я вижу все, что я ввожу в старом окне. Умный прием! – Stefan Lasiewski 31.07.2012, 22:35logfile
..." должен быть "стандартный вывод и стандартная погрешность". Я отредактирую для создания исправления. – Kevin Fegan 09.02.2014, 16:48