TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #160 6.46K
Подстановка вывода команды: $()

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

Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:


Название: Зеркала
Исполнитель: Лепс
Острые углы, нервы, суета


Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:


$ grep -l "Лепс" *.txt
song1.txt
song2.txt


Затем переместить каждый файл в необходимый каталог:


$ mkdir leps
$ mv song1.txt leps
$ mv song2.txt leps


Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».

Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:


$ mv $(grep -l "Лепс" *.txt) leps


Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.

Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:


$ mv song1.txt song2.txt leps


В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:


переменная=$(команда)


Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:


status=$(ls ./ 2>/dev/null | wc -l)

if [ "$status" -gt 0 ]; then
echo "В директории есть $status файлов"
else
echo "Директория пуста или не существует"
fi


Выдаем права на выполнение, запускаем и проверяем:


$ chmod +x script.sh
$ ./script.sh
В директории есть 66 файлов


Для чего бывает полезно брать "$()" в кавычки?

Есть несколько основных кейсов, когда следует использовать "$()" вместо $().

Во-первых, если вывод команды содержит пробелы, он будет разбит на отдельные слова.

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

Есть момент - имя каталога состоит из нескольких слов, разделенных пробелами "photo and video":


$ pwd
$ /home/xoadmin/photo and video
$ chmod 777 $(pwd)


После подстановки оболочка интерпретирует это как попытку применить chmod к трём разным объектам: "/home/xoadmin/photo", "and", и "video". Это, вероятно, приведёт к ошибке:


chmod: cannot access '/home/xoadmin/photo': No such file or directory

chmod: cannot access 'and': No such file or directory

chmod: cannot access 'video': No such file or directory


Чтобы вывод pwd воспринимался, как единое целое, следует заключить оператор в кавычки:


$ chmod 777 "$(pwd)"


Во-вторых, без кавычек, символы перевода строки могут быть удалены при выводе через echo:


$ echo $(ls)
adduser.conf alsa alternatives apache2 apg.conf apparmor


Если требуется сохранить четкую структуру текста, содержащего спец символы, следует использовать "$()":


$ echo "$(ls)"
adduser.conf
alsa
alternatives


LinuxCamp
  • 👍 39
  • 🔥 16
  • ❤ 7
  • 🎄 4
  • ❤‍🔥 2
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →