LINUX.ORG.RU

обзор директорий bash

 


0

4

Вот такая штука позволяет пройтись по всем директориям:

for i in */; do
Но как?? Не может же он перебирать все возможные сочитания до слэша. Или есть какое-то соглашение, что последовательности в for связаны с файлами, лежащими в текущей директории?

★★★★
Ответ на: комментарий от Spoofing

Немного не в том вопрос. Вот например

for i in 1 2 3;
Берется i и присваивается ему любое значение из списка. Тут вопросов нет. Но если я написал */ то как технически он знает какие значения перебирать?

hotpil ★★★★
() автор топика
Ответ на: комментарий от hotpil

Сначала строит список доступных объектов, потом выбирает те, что подходит под глобы. Либо каждый объект сравнивает с глобой и решает выводить или нет. Но для ls * думаю есть исключение дабы лишнюю работу не делать.

Deleted
()
Ответ на: комментарий от hotpil

а как раскрывается

$ ls *
у тебя вопросов не возникает?

anonymous
()

'*' - это шаблон, что-то вроде упрощенного регулярного выражения.
Сначала bash раскроет ее так, что '*' будет заменена на все каталоги, разделенные пробелом, потом это в качетсве аргументов будет передано команде. Можешь это проверить на echo */. То есть замена произвойдет еще до того, как for/echo будет вызван. Из этого следует следующее:
1. Это работает для абсолютно любой команды запущеной в bash
2. Если в именах директорий будут пробелы, скорее всего это будет работать не так, как тебе нужно.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

2. Если в именах директорий будут пробелы, скорее всего это будет работать не так, как тебе нужно.

Ты уверен?

$ mkdir -p test/dir\ with\ space\ {1,2,3} && cd test
$ printf '%s\n' */
dir with space 1/
dir with space 2/
dir with space 3/

anonymous
()
Ответ на: комментарий от anonymous

Ого! А я думал это так.
Посыпаю голову пеплом, был неправ....

Kroz ★★★★★
()

Включите xtrace — все поймете:

set -o xtrace 
Zmicier ★★★★★
()
Ответ на: комментарий от conformist

«Мало багов? Ваша программа слишком хорошо работает? Решение есть: Conformist! Хрестоматийные и инновационные антипаттерны на любой случай».

Zmicier ★★★★★
()
Ответ на: комментарий от conformist

Я напомню, что подстановка * -- это массив строк с именами файлов, подпадающих под глоб, а подстановка $() (``) -- это одна строка с выводом внешнего процесса, которую надо парсить, и которая к тому же рассыпалась по пробелам, не будучи экранированной "".

d_a ★★★★★
()
Ответ на: комментарий от Zmicier

2. Если в именах директорий будут пробелы, скорее всего это будет работать не так, как тебе нужно.

По ходу треда может показаться, что случай с printf — выход из ситуации, однако это не так, что я и продемонстрировал.

conformist ★★★
()
Ответ на: комментарий от conformist

$ printf '%s\n' */ к чему тогда вообще это нужно было?

Продемонстрировать, что каждый файл из подстановки */ уезжает дальше одним аргументом, не разваливаясь по пробелам, как одному из участников обсуждения показалось ранее. Может быть моя иллюстрация будет нагляднее:

args() {
    printf "%d args:" $#
    printf " <%s>" "$@"
    echo
}

$ args */
3 args: <dir with space 1/> <dir with space 2/> <dir with space 3/>

d_a ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.