На этот вопрос уже есть ответ здесь:
Я хочу найти путь к файлу и сохранить этот вывод в переменной в сценарии оболочки. В частности, в оболочке bash, если я напишу
GCC_VERSION="find *-gcc"
Then
echo ${GCC_VERSION}
Prints
find some-gcc
Как мне заставить переменную GCC_VERSION
просто удерживать вывод find
?
Вот как мне сохранить вывод команды find * -gcc
в переменной GCC_VERSION
, чтобы
echo ${GCC_VERSION}
напечатал
some-gcc
Во-первых, ваша команда find
неверна. Если вы хотите найти все файлы, которые заканчиваются на -gcc
в текущем каталоге, это должно быть:
$ find . -type f -name "*-gcc"
Для сохранения вывода с find
в GCC_VERSION
используйте process substitution
[ 119]:
$ GCC_VERSION=$(find . -type f -name "*-gcc")
Обратите внимание, что у вас может быть несколько файлов, оканчивающихся на -gcc
, поэтому заключите имя переменной в двойную кавычку:
$ echo "$GCC_VERSION"
./mipsel-linux-gnu-gcc
./aarch64-linux-gnu-gcc
./mips-linux-gnu-gcc
./arm-linux-gnueabihf-gcc
Необходимо использовать назад галочки
VARIABLE=`Command`
или лучше рекомендуемый новый стиль управляет синтаксисом замены
VARIABLE=$(Command)
В то время как обе формы поддерживаются, существуют ограничения к встраиванию сценария в первого.
Кавычка от выпуска Выпуска 7, 2018 Спецификаций Основы Open Group:
"$ ()" форма замены команды решает проблему непоследовательного поведения при использовании одинарных левых кавычек. Например:
Command Output
echo '\$x' \$x
echo `echo '\$x'` $x
echo $(echo '\$x') \$x
Кроме того, backquoted синтаксис имеет исторические ограничения на содержание встроенной команды. В то время как более новый "$ ()" форма может обработать любой вид действительного встроенного сценария, форма backquoted не может обработать некоторые действительные сценарии, которые включают одинарные левые кавычки. Например, эти в других отношениях действительные встроенные сценарии не работают в левом столбце, но действительно работают справа:
echo ` echo $(
cat <<\eof cat <<\eof
a here-doc with ` a here-doc with )
eof eof
` )
... конец кавычки.