Почему много команд предоставляют “тихую” возможность?

Это не расширение y, но значение, присваиваемое y это - проблема.

У Вас есть это

y=$($x/*(o+rand[1]))

Присваиваемое значение является результатом замены команды ($(…)). Единственное “слово” в команде, которой заменяют, является выражением шарика. Это означает, что попытается выполнить выбранный файл как команду (который, вероятно, вызовет ошибку и не произведет полезного вывода).

Чтобы заставить это работать (хотя с изменением в семантике), можно изменить присвоение замены команды в присваивание массива (т.е. удалить $ после =):

y=($x/*(o+rand[1]))

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

y=$(print -- $x/*(o+rand[1]))

Но здесь существует скрытая проблема. Каждый шарик будет оценен в отдельной подоболочке, таким образом, каждый каталог будет использовать ту же последовательность случайных чисел для сортировки ее записей. Можно наблюдать это, если Вы используете set -x и посмотрите на последовательность значений, присваиваемых для ОТВЕТА для каждого каталога. Это означает, что файлы не будут выбраны независимо через каталоги.

Вот некоторые альтернативные подходы, которые можно использовать для присвоения расширения шарика на параметр (они сохраняют $RANDOM оценка в той же оболочке, таким образом, выборы будут (более) независимыми):

for y in $x/*(o+rand[1]); do print -- ${y:r}; done
set -- $x/*(o+rand[1]); print -l -- ${@:r}

Если Вы хотите обработать пустые каталоги, то необходимо, вероятно, добавить N спецификатор шарика (действует, как будто NULL_GLOB были установлены). Это также поможет обработать некаталоги, которые соответствуют внешнему шарику (хотя Вы могли использовать / спецификатор шарика для ограничения того одного просто каталогами).

rand() REPLY=$RANDOM
for x in *(/); do y=($x/*(No+rand[1])); print -l -- ${y:r}; done
37
19.03.2015, 19:40
4 ответа
  • Хотя вы можете легко переориентироваться в оболочке, есть и другие контексты, где это не так просто, например, когда команда выполняется на другом языке без использования командной строки оболочки. Даже в оболочке:

    найти . -тип f -exec grep -q foo {} \; -printf '%s\n'.
    

    для печати размера всех файлов, содержащих foo. Если вы перенаправитесь на /dev/null, то потеряете вывод как find, так и grep. Вам нужно будет прибегнуть к -exec sh -c 'exec grep foo "$1". /dev/null' sh {} \; (то есть породить дополнительную оболочку).

  • grep -q foo короче, чем grep foo > /dev/null
  • Переадресация на /dev/null означает, что вывод все еще записывается, а затем отбрасывается, что менее эффективно, чем не записывать (и не выделять, подготовить этот вывод к записи)
  • , что позволяет провести дальнейшую оптимизацию. Например, в случае grep, так как с -q, grep знает, что вывод не нужен, он выходит, как только находит первое совпадение. С помощью grep > /dev/null он все равно будет пытаться найти все совпадения.
  • quiet не обязательно означает silent. Для некоторых команд это означает уменьшение глагола (противоположность -v|-verbose). Например, mplayer имеет --quiet и --really-quiet. С помощью некоторых команд можно использовать -qqq для уменьшения глагола в 3 раза.
71
27.01.2020, 19:36

Это все еще позволяет командовать Поместите, когда ощущается, что ему нужно записку на экран, но обычно это ничего не ставит. С перенаправлением всех нулей нет шансов для вывода вывода.

3
27.01.2020, 19:36

Хотя это, вероятно, зависит от команды, -q также отключил бы вывод на stderr. Это позволяет оболочкам, которые не позволяют легко дублировать stderr на stdout (я смотрю на вас, csh и tcsh), чтобы избежать шума.

Некоторые программы предоставляют "тихий" вариант для ситуаций, когда он может иметь другой смысловой вывод, который не хочет загромождать сообщениями о состоянии. -q или эквивалентная функция заставит замолчать весь вывод статуса программы, позволяя получить чистый поток данных, скажем, tar или gzip.

2
27.01.2020, 19:36

Помимо всех хороших ответов и точек выше. Это лучшая практика, чтобы обеспечить противоположный вариант для каждого флага. Итак, если есть -V для полдыности должно быть --q для неребственности, вполне или тишины. (Это не точка обсуждения, но ...) То же самое, что должен быть длинный вариант для каждой короткой, -Q и - куда.

Как почти всего в нашем бизнесе, есть много способов получить решение или те же результаты. -Q - один из них.

0
27.01.2020, 19:36

Теги

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