GNU находит и маскирование {} для некоторых оболочек - который?

Если Вы хотите инструмент командной строки, я предпочитаю ncdu, ncurses версию du. Это сканирует диск (или данная папка) и затем показывает использования пространства верхнего уровня; можно выбрать данный каталог, чтобы получить соответствующую сводку для того каталога и возвратиться, не будучи должен повторно проанализировать:

Screenshot of ncdu


Если Вы соглашаетесь с программой GUI, Filelight является самой близкой вещью к WinDirStat, который я нашел; это показывает графическое представление потребления пространства:

Screenshot of Filelight

Как ncdu, Filelight позволяет Вам выбрать данный каталог для получения разбивки для того каталога

34
11.11.2018, 01:32
3 ответа

Сводка: Если когда-нибудь была оболочка, которая расширилась {}, это - действительно старый материал прежней версии к настоящему времени.

В Оболочке Bourne и в совместимых POSIX оболочках, фигурные скобки ({ и }) обычные символы (в отличие от этого, ( и ) которые являются ограничителями слова как ; и &, и [ и ] которые являются globbing символами). Следующие строки, как все предполагается, печатаются буквально:

$ echo { } {} {foo,bar} {1..3}
{ } {} {foo,bar} {1..3}

Слово, состоящее из единственной фигурной скобки, является зарезервированным словом, которое является только особенным, если это - первая команда.

Ksh реализует расширение фигурной скобки как несовместимое расширение Оболочки Bourne. Это может быть выключено с set +B. Bash эмулирует ksh в этом отношении. Zsh реализует расширение фигурной скобки также; там это может быть выключено с set +I или setopt ignore_braces или emulate sh. Ни одна из этих оболочек не расширяется {} в любом случае, даже когда это - подстрока слова (например. foo{}bar), из-за общего использования в аргументах find и xargs.

Единственный Unix v2 отмечает это

В некоторых исторических системах фигурные скобки рассматривают как операторы управления. Для помощи в будущих операциях стандартизации портативные приложения должны избегать использования закрывших кавычки фигурных скобок для представления самих символов. Возможно, что будущая версия ISO/IEC 9945-2:1993 стандарт может потребовать этого { и } рассматривайте индивидуально как операторы управления, хотя маркер {} вероятно, будет освобождение особого случая от этого из-за часто используемого find {} создать.

Это примечание было отброшено в последующих версиях стандарта; примеры для find закрыли кавычки использование {} также как и примеры для xargs. Возможно, были исторические Оболочки Bourne где {} должен был быть заключен в кавычки, но они будут действительно старыми унаследованными системами к настоящему времени.

csh реализации, которые я имею под рукой (OpenBSD 4.7, BSD csh на Debian, tcsh) все расширяются {foo} кому: foo но отпуск {} один.

26
27.01.2020, 19:37
  • 1
    @geekosaur: Только небольшое подмножество скидки с цены работает в комментариях. Я не знаю то, что Вы пытаетесь сказать. Если это о ksh и расширении фигурной скобки al, считайте мое начало абзаца “с расширения фигурной скобки реализаций Ksh как несовместимое расширение”. –  Gilles 'SO- stop being evil' 05.03.2011, 21:52
  • 2
    Это было bash (см. $BASH_VERSION). Расширение фигурной скобки очень живо и здорово. –  geekosaur 05.03.2011, 22:18
  • 3
    Это было точкой. {} синтаксис, порожденный в csh, но {} расширенный до пустой строки. Более новые оболочки распознают, что это бессмысленно, но существуют все еще некоторые старые cshs там. –  geekosaur 05.03.2011, 22:47
  • 4
    @geekosaur: можно ли сказать который определенная csh-версия относительно который определенная платформа? Я предпочел бы тестировать его сам (если это возможно на Linux) или быть гарантированным, что человек testet это сам. –  user unknown 06.03.2011, 00:30
  • 5
    @geekosaur, {}foo расширился бы до foo, но {} расширился бы до {} (кроме тех случаев, когда в обратных галочках, но заключении в кавычки не помог бы), и был зарегистрирован как таковой. Я проверил его для csh 2BSD (первый выпуск), 2.79BSD, 2.8BSD и 2.11BSD. –  Stéphane Chazelas 07.12.2015, 00:05

Одним словом, csh. bash и другие современные оболочки распознают, что пользователь, вероятно, не просит пустое расширение фигурной скобки. (Современный csh на самом деле tcsh и может также обработать {} нормально к настоящему времени.)

1
27.01.2020, 19:37
  • 1
    Хороший для слушания но я прошу противоположное, оболочку, для которой не обрабатывает его нормально. –  user unknown 05.03.2011, 17:49
  • 2
    Вы предполагаете, что кто-то вошел бы и сорвал бы информационную ссылку страницы на дополнительное заключение в кавычки просто, потому что системы Linux все имеют более новый csh. Не все выполняют утилиты GNU на Linux; на самом деле довольно распространено установить их в более старых коммерческих системах Unix, связанные команды которых ограничены. (Замена csh в тех системах менее вероятно, потому что системные сценарии могут полагаться на особенности оригинала csh, и даже если пользователи были все настроены для использования более нового csh, root должен был бы почти наверняка остаться комплектной версией.) –  geekosaur 05.03.2011, 17:55
  • 3
    . Я нахожусь в дебатах с парнем, который говорит, что в нашей Wiki мы должны дать совет использовать "{}" все время, потому что в странице справочника говорится так. И теперь я хотел бы знать, существует ли оболочка, которую я не использую, как ksh, zsh, tcsh, csh или XYZsh, который я не знаю, для которого это требование верно, или могу ли я честно принять, что нет. Если существуют оболочки для различных Unixes, которым нужно "{}", который был бы прекрасным объяснением, почему предложение находится все еще в странице справочника, но не соответствующее как совет для новичков Linux. –  user unknown 05.03.2011, 21:14
  • 4
    Теперь я задаюсь вопросом если pdksh делает правильную вещь..., хотя корректный ответ на это, вероятно, "реален ksh FOSS в эти дни". –  geekosaur 05.03.2011, 21:26
  • 5
    Pdksh, как mksh, ksh93, удар и zsh, только разворачивает фигурные скобки, когда существует промежуточная запятая (или .. для ksh93, удара и zsh). Только (t) csh расширяется {foo} кому: foo, и даже это уезжает {} один (по крайней мере, на недавнем BSD's). –  Gilles 'SO- stop being evil' 05.03.2011, 22:42

В версиях оболочки {} до версии 3.0.0 fish требовалось заключать в кавычки.

$ fish -c 'echo find -exec {} \;'
find -exec  ;

И в оболочке rc (также akanga, основанной на rc, но не es):

$ rc -c "echo find -exec {} ';'"
line 1: syntax error near '{'

Вероятно, это не те оболочки, которые имели в виду авторы документации GNU find, когда писали этот текст, поскольку fish была впервые выпущена в 2005 году (тогда как этот или похожий текст уже существовал в 1994 году), а rc изначально не была оболочкой Unix.

Ходят слухи, что некоторые версии csh (оболочка, в которой появилось расширение скобок) требовали этого. Но трудно отдать должное этим версиям, поскольку первый выпуск csh в 2BSD этого не делал. Вот как это проверялось в эмуляторе PDP11:

# echo find -exec {} \;
find -exec {} ;

А на странице man из 2BSD csh ясно сказано:

Как особый случай `{', `}' и `{}' передаются без помех.

Поэтому мне было бы очень странно, если бы последующая версия csh или tcsh позже нарушила это.

Это могло быть сделано для того, чтобы обойти некоторые ошибки в некоторых версиях. Все еще с этим 2BSD csh (то же самое в 2.79BSD, 2.8BSD, 2.11BSD):

# csh -x
# echo foo {} bar
echo foo {} bar
foo {} bar
# echo `echo foo {} bar`
echo `echo foo {} bar`
echo foo {} bar
foo  bar

Цитирование не помогает:

# echo `echo foo '{}' bar`
echo `echo foo '{}' bar`
echo foo {} bar
foo  bar

Вы могли бы процитировать всю подстановку команды:

# echo "`echo foo {} bar`"
echo `echo foo {} bar`
echo foo {} bar
foo {} bar

Но это передача одного аргумента внешнему echo.

В csh или tcsh вам нужно будет заключить в кавычки {}, если он не является самостоятельным, как в:

find . -name '*.txt' -type f -exec cp {} '{}.back' \;

(хотя такое использование find не является переносимым, так как некоторые findы расширяют {} только когда они сами по себе).

15
29.04.2021, 01:00

Теги

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