Разделение Word, когда параметр используется в замене команды

что "общее количество" означает в ls - al

Большой вопрос, это означает, что Вы хотите уделить внимание деталям. Я проиллюстрирую с примерами. В соответствии с моим корневым каталогом /home/el существует каталог, названный tmpdir с файлами под ним. Я изменяюсь на тот каталог и делаю ls -al

el@angeliqe ~/tmpdir $ ls -al
total 20
drwxrwxr-x 4 el users 4096 Dec 21 11:45 .
drwx--x--x 9 el users 4096 Dec 21 11:45 ..
drwxrwxr-x 2 el users 4096 Dec 21 11:45 dirWithFiles
drwxrwxr-x 2 el users 4096 Dec 21 11:44 emptydir
-rw-rw-r-- 1 el users  182 Dec 21 11:45 myfile.txt

Это говорит 'общие 20'. Это переводит в: "tmpdir использует 20K пространства на диске для всех каталогов и файлов".

с-h опцией Вы говорите этому давать его Вам в человекочитаемой форме:

el@angeliqe ~/tmpdir $ ls -alh
total 20K
drwxrwxr-x 4 el users 4.0K Dec 21 11:45 .
drwx--x--x 9 el users 4.0K Dec 21 11:45 ..
drwxrwxr-x 2 el users 4.0K Dec 21 11:45 dirWithFiles
drwxrwxr-x 2 el users 4.0K Dec 21 11:44 emptydir
-rw-rw-r-- 1 el users  182 Dec 21 11:45 myfile.txt

Интересно отметить, что каталог ни с чем в нем также поднимает пространство 8K в моем случае emptydir ничего не имеет в нем, но показывает использующий 8K

el@angeliqe ~/tmpdir/emptydir $ ls -al
total 8
drwxrwxr-x 2 el users 4096 Dec 21 11:44 .
drwxrwxr-x 4 el users 4096 Dec 21 11:45 ..

Добавление пустого каталога доказывает, что каталоги поднимают 4K:

el@angeliqe ~/tmpdir/emptydir $ ls -alh
total 12K
drwxrwxr-x 3 el users 4.0K Dec 21 11:54 .
drwxrwxr-x 4 el users 4.0K Dec 21 11:45 ..
drwxrwxr-x 2 el users 4.0K Dec 21 11:54 blah

Другая команда для исследования du:

el@angeliqe ~/tmpdir/emptydir $ du
4       ./blah
8       .

Кроме того, можно посмотреть на размеры файла на определенную глубину:

el@angeliqe ~ $ du -h --max-depth=1
12K     ./.ssh
4.0K    ./my_recycle_bin
8.0K    ./.vim
13G     ./gnuoctbluehost
24K     ./tmpdir
48K     ./.subversion
152K    ./.cpan
13G     .
el@angeliqe ~ $
6
13.11.2013, 01:50
2 ответа

Необходимо поместить двойные кавычки вокруг всей переменной и замен команды.

set -- "$(basename -- "$file")"

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

5
27.01.2020, 20:27
  • 1
    Спасибо. То, что отбросило меня, было различием в пути дескрипторы удара вложенные двойные кавычки в set -- "xy "$file"" по сравнению с set -- "$(basename -- "$file")". Таким образом, когда замена команды играет роль, удар может интерпретировать вложенные кавычки "естественно"? –  iruvar 13.11.2013, 02:44
  • 2
    @1_CR Да (если Вы используете $(…) форма замены команды а не устаревающие одинарные левые кавычки). –  Gilles 'SO- stop being evil' 13.11.2013, 02:51

У Вас есть несколько опций,

  1. Используйте "$" * вместо этого "$"

     set -- $(basename "$file")
     printf "%s\n" "$*"
    
  2. Заключите в кавычки замену команды и переменную,

     set -- "$(basename "$file")"
     printf "%s\n" "$@"
    
3
27.01.2020, 20:27
  • 1
    Действительно не должен использовать № 1, поскольку он может все еще привести к ненадежным результатам. № 2 является только путем :-) –  Patrick 13.11.2013, 01:00

Теги

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