Суммируйте размер каталога с убывающим человеческим размером
du -hs */ | sort -hr
например.
10.2G foo/
4M bar/
Конец комментариев в первой новой строке (см. маркерное правило 10 распознавания оболочки), не позволяя строки продолжения, таким образом, этот код имеет foo
в отдельной командной строке:
echo # this is a comment \
foo
Что касается Вашего первого предложения, обратная косая черта не сопровождается новой строкой, Вы просто заключаете пространство в кавычки: это эквивалентно
echo ' # this is a comment'
foo
$(: this is a comment)
заменяет выводом команды : this is a comment
. Если вывод той команды пуст, это - эффективно очень запутывающий способ вставить комментарий посреди строки.
Нет никакого волшебного продолжения: :
обычная команда, утилита двоеточия, которая ничего не делает. Утилита двоеточия главным образом полезна, когда синтаксис оболочки требует команды, но Вам, оказывается, нечего делать.
# Sample code to compress files that don't look compressed
case "$1" in
*.gz|*.tgz|*.bz2|*.zip|*.jar|*.od?) :;; # the file is already compressed
*) bzip2 -9 "$1";;
esac
Другой вариант использования является идиомой для установки переменной, если это уже не установлено.
: "${foo:=default value}"
Комментарий о goto является историческим. Утилита двоеточия датируется от даже перед Оболочкой Bourne, полностью к оболочке Thompson, которая имела goto инструкцию. Двоеточие затем означало маркировку; двоеточие является довольно общим синтаксисом для маркировок goto (оно все еще присутствует в sed).
Этого можно добиться с помощью массивов Bash, например,
#!/bin/bash
CMD=(
echo # this is a comment
foo
)
"${CMD[@]}"
Это определяет массив, $CMD
, а затем расширяет его. После разворачивания вычисляется результирующая строка, и в этом случае выполняется echo foo
.
Текст между (
и )
определяет массив и подчиняется обычному синтаксису bash, поэтому все в строке после #
игнорируется.
${CMD[@]}
расширяется до строки single, которая представляет собой конкатенцию всех элементов, разделенных пробелом. После разворачивания Бэш разобрал бы строку на токены обычным способом (c.f $IFS), что часто не является тем, что мы хотим.
Напротив, если разложение обёрнуто в двойные кавычки, т.е. "${CMD[@]}"
, то каждый элемент в массиве сохраняется. Рассмотрим разницу между hello world second item
и "hello world" "second item"
.
Illustrative example:
# LIST=("hello world" "second item")
# for ITEM in ${LIST[@]}; do echo $ITEM; done
hello
world
second
item
# for ITEM in "${LIST[@]}"; do echo $ITEM; done
hello world
second item
Не делайте $ (: comment)
. Это не комментарий - это подоболочка - еще один совершенно новый процесс оболочки для большинства оболочек. Ваша цель состоит в том, чтобы делать меньше с вашим вкладом, а не больше, что и будет делать - даже если это бессмысленно.
Вместо этого вы можете сделать ...
printf '<%s>\n' some args here ${-##*"${--
my long comment block
}"} and "more ${-##*"${--
and another one in the
middle of the quoted string
there shouldn\'t b\e any special &
(character) `echo issues here i hope >&2`
basically anything that isn\'t a close \}
$(echo the shell is looking for one >&2)
}$(echo "}'"\" need backslash escaping >&2
)${-##*${--
nesting is cool though
}}"}here too"
}'" need backslash escaping
<some>
<args>
<here>
<and>
<more here too>
По сути, там происходит то, что оболочка выполняет подстановку. Он заменяет значение специального параметра оболочки $ -
дважды каждый раз. В любом случае это короткая строка, но она всегда установлена - и поэтому внутренняя подстановка - которая интерпретируется как образец для отделения от внешней - не расширяется до содержимого между скобки, когда я использую форму раскрытия -
.
Здесь:
bash -x <<""
printf %s\\n '${-##*"'${-- a set param doesn\'t expand to this optional text }'"}'
+ printf '%s\n' '${-##*"hxB"}'
${-##*"hxB"}
Видите? Так что он просто расширился дважды. Как только оболочка обнаруживает, что параметр установлен, все в необязательном поле расширения отбрасывается, в значительной степени, и оно расширяется до своего целого значения, которое удаляется из самого себя и, таким образом, вообще до нуля. В большинстве оболочек вам не нужны даже escape-кавычки, но bash
требует этого.
Еще лучше:
COMMENT=
echo ${COMMENT-"
this will work the same way
but the stripping isn\'t
necessary because, while
the variable is set, it is also
empty, and so it will expand to
its value - which is nothing
"} this you\'ll see
this you'll see
make_FIND
, беглый сценарий, который создает длинный список аргументовfind
. Здесь, мотивация для создания его разделяет на блоки блоком, то, что каждый блок прибывает из тела цикла, но тот же стиль позволяет комментировать каждый блок. – Gilles 'SO- stop being evil' 21.08.2011, 20:46