Мне нужно подсчитать количество исполняемых файлов в каталоге.
Я уже нашел другой способ сделать это (записав в файл, а затем выполнив поиск в файле, но это довольно некрасиво).
Первое решение, которое пришло мне в голову, было таким (первый аргумент — путь к каталогу):
#!/bin/bash
noe=0
files=`ls -F $1` # because the -F option appends an indicator
# to the file, for an executable it's an '*'
# so if there is an executable 'script.sh' in the dir
# the output will be like this: 'script.sh*'
for i in $files
do
if [ `echo "$i" | grep '*$'` ] #should search for an '*' at the end...
then
let noe += 1
fi
done
echo $noe
Это не работает, потому что '*' опускается в цикле for.
(команда echo в цикле for выводит имя файла без '*' в конце, но нормально работает вне цикла for, когда аргумент находится в "")
Есть аналогичный вопрос об этом здесь , и мне удалось адаптировать ответ к моему случаю, но не объясняется, почему это нельзя сделать с for. + Я не совсем понимаю, зачем в цикле while дополнительный <
...
done < <(ls -F $1)
^
|_ I know that this means redirect to file to loop
Does the second < mean that we are redirecting the
standard input file? (this might be a stupid question)
Другой вопрос: есть ли способ обойти это с помощью цикла for и почему?
<
является частью синтаксиса<(command)
для подстановки процесса. - person Barmar   schedule 22.05.2015