Отказываюсь разбирать вывод ls
, потому что он нестабильный.
Первая попытка не удалась с read
и find
:
read VARIABLE < $(find ./ -type f -name "PATTERN" | sort -r)
Но это приводит к неоднозначному перенаправлению.
Вторая попытка не удалась: он сохранил файл /boot
, не знаю почему, меня не было в /
:
find ./ -type f -name "PATTERN" | sort -r | read VARIABLE
Третья попытка не удалась: используйте подоболочка:
{ read VARIABLE; } < $(find ./ -type f -name "PATTERN" | sort -r)
Без изменений.
В итоге я добился того, чего хотел:
variable=$(find ./ -type f | sort -r | head -1)
Но решение меня не устраивает, потому что использование head
для извлечения первой строки кажется некрасивым.
Кроме того, весьма вероятно, что мне понадобится только вторая строка (я знаю, что я получу от head -2 | tail -1
)
Интересно, можно ли использовать какой-нибудь вариант этого:
{ read line1 ; read line2; } < $(find ./ -type f -name "PATTERN" | sort -r)
Синтаксис для Замена процесса определен неправильно, это <()
и нет<$()
. Вы должны понимать, что <()
помещает вывод команды во временный файл под /var/tmp
или в файловый дескриптор /dev/fd/*
в зависимости от вашей ОС. Чтобы работать с файлом с помощью команды read
, вам необходимо перенаправить его содержимое с помощью ведущего <
, который помещает содержимое файла в стандартный поток ввода команды read
для чтения строки.
read -r lastfile < <(find ./ -type f -name "PATTERN" | sort -r)
Помните, что подстановка процесса - это функция оболочки снова и снова, она недоступна в POSIX-совместимой оболочке Bourne sh
.
Что касается других попыток, то попытка с трубкой никогда не сработает.
find ./ -type f -name "PATTERN" | sort -r | read VARIABLE
потому что VARIABLE
устанавливается во вспомогательной оболочке из конвейера и никогда не будет распространяться на родительскую оболочку. Если бы вы напечатали его так, как и когда вы прочитали его в дочерней оболочке, это сработало бы.
find ./ -type f -name "PATTERN" | sort -r | { read -r lastfile; echo "$lastfile" ; }
И один с составными операторами, включающими фигурные скобки { ;}
, имеет ту же проблему использования неправильного синтаксиса для замены процесса, который должен был быть
{ read -r lastfile; } < <(find ./ -type f -name "PATTERN" | sort -r)
и один с двумя командами read
{ read -r file1 ; read -r file2; } < <(find ./ -type f -name "PATTERN" | sort -r)