Почему расширения Bash Brace не работают для команд?

Поиск самых больших файлов в файловой системе всегда занимает много времени. По определению вы должны пройти всю файловую систему в поисках больших файлов. Единственное решение, вероятно, - запустить задание cron на всех ваших системах, чтобы файл был готов заранее.

Еще одна вещь: опция x для du полезна для предотвращения перехода du к точкам монтирования в другие файловые системы. Я.e:

du -x [path]

Полная команда, которую я обычно выполняю, выглядит так:

sudo du -xm / | sort -rn > usage.txt

-m означает возврат результатов в мегабайтах, а sort -rn сначала отсортирует результаты по наибольшему номеру. Затем вы можете открыть usage.txt в редакторе, и самые большие папки (начиная с /) будут вверху.

7
11.02.2019, 14:05
3 ответа

Недопустимое раскрытие фигурной скобки. Раскрытие фигурной скобки должно состоять из одного слова в оболочке.

Слово — это строка, разделенная пробелами без кавычек (, табуляцией или новой строкой по умолчанию ), а строка {chown httpd,chmod 700}состоит из трех отдельных слов {chmod, http,chmodи 700}и не будет распознан как расширение фигурной скобки.

Вместо этого оболочка будет интерпретировать строку как команду {chown, выполняемую с аргументами http,chmod, 700}и /dir/test1.

Самый простой способ проверить это с помощьюecho:

$ echo {chown httpd,chmod 700} /dir/test1
{chown httpd,chmod 700} /dir/test1

$ echo {"chown httpd","chmod 700"} /dir/test1
chown httpd chmod 700 /dir/test1

Обратите внимание, что даже если бы раскрытие фигурных скобок сработало, команда была бы бессмысленной.

Просто напишите две команды,

chown http /dir/test1
chmod 700  /dir/test1
11
27.01.2020, 20:14

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

Таким образом, эта командная строка будет сначала разделена на {chown, httpd,chmodи 700}, а затем, поскольку {chownне является допустимым шаблоном раскрытия скобок, она будет оставлена ​​как есть, и bash попытается для запуска команды с этим именем.

Это цитата из справочной страницы:

Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.

Обратите внимание на порядок, который отличается от других оболочек (в zsh, раскрытие фигурных скобок будет выполнено после арифметического расширения, а дополнительное разбиение слов вообще не будет выполняться ).

Следующее будет печатать 1 2в zshили kshи x yв bash:

.
f=; f1=x; f2=y; echo $f{1,2}
6
27.01.2020, 20:14

Другие ответы объяснили, почему расширение фигурной скобки не работает. На мгновение проигнорировав этот вопрос, вы, вероятно, захотите избежать повторения имени файла, и есть другие способы сделать это. Либо присвойте имя файла переменной, либо используйте специальную переменную $_(, она содержит последнее слово оболочки предыдущей команды):

f="some long and ugly filename"
chown httpd "$f"
chmod 700 "$f"

или

chown httpd "some long and ugly filename"
chmod 700 "$_"
1
27.01.2020, 20:14

Теги

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