У меня есть фундаментальный вопрос о том, как работает bash, и связанный с ним практический вопрос.Bash, переплетение каталогов
Фундаментальный вопрос: предположим, что я в каталоге, который имеет три подкаталога: a, b и c.
курица код
for dir in $(ls)
do
echo $dir
done
выплевывает:
a b c
a b c
a b c
т.е., dir
всегда хранит список всех файлов/каталогов в моем cwd
. Мой вопрос: почему в мире это было бы удобно? На мой взгляд, это гораздо полезнее и интуитивное иметь dir
магазин каждый элемент в то время, то я хотел бы иметь выходную
a
b
c
Кроме того, в соответствии с одним из ответов - это неправильно использовать for dir in $(ls)
, но когда я использую for dir in $(ls -l)
, я получаю еще больше копий a b c
(больше, чем есть каталоги/файлы в cwd). Почему это?
Мой второй вопрос практичен: как мне перебирать все каталоги (а не файлы!) В моем cwd
, которые начинаются с капитала W? Я начал с
for dir in `ls -l W*`
но это не получается, потому что: a) причина в вопросе 1 и b), поскольку она не исключает файлы. Предложения оценены.
Ваш фрагмент кода не дает результата, который вы говорите. Прочтите более подробный код. –
Вы правы. Когда я впервые пытался использовать этот код, я использовал '$ (ls)', но когда я написал вопрос, я изменил '$ (ls)' на '$ (ls -l)', потому что это похоже на то, как это делается везде Я посмотрел. Я предположил, что выход будет таким же, и я удивлен, что это не так. – alexvas
@alexvas Почему вы удивлены тем, что вывод 'ls -l' отличается от результата' ls'? Параметр изменяет свое поведение (подробнее см. «Man ls'):' -l' дает вам длинный вывод, включая разрешения, право собственности, дату и т. Д. Это еще больший no-no для синтаксического анализа, потому что его результат может сильно отличаться о реализации и вашей «локали». 'ls -l' - это то, что вы использовали бы в командной строке, но никогда в сценарии, подобном этому. Если вы видели код, который анализирует свой результат в вашей среде, вы должны связаться с автором и попросить его исправить. –