Еще одним видом подстановок, выполняемых командным интерпретатором, являются подстановки вывода команд. Конструкции вида $(command) (или ее более старая форма ‘command’) используется для подстановки результата вывода команды command на поток STDOUT в место ее использования.
Широко распространена подстановка результата работы команды comand2 в качестве аргументов команды command1, используемая в виде command1 $(comand2). Для сравнения, при конвейерной обработке результаты выполнения одной команды передаются » качестве исходных данных другой программе.
Так, например, можно, зная полный путь (который можно получить при помощи which) к определенной утилите, узнать при помощи dpkg пакет программного обеспечения, которому он принадлежит, что показано в примере из листинга ниже в режиме трассировки.
В каком пакете утилита?
bender@ubuntu:~$ which lspci
/usr/bin/lspci
bender@ubuntu:~$ set -x
bender@ubuntu:~$ dpkg -S ‘which lspci*
++ which lspci
+ dpkg -S /usr/bin/lspci
pciutils: /usr/bin/lspci
bender@ubuntu:~$ dpkg -S $(which lspci) | cut -f 1 -d : | xargs dpkg -s
Package: pciutils
Description: Linux PCI Utilities
This package contains various utilities for inspecting and setting of
devices connected to the PCI bus.
Homepage: http://atrey .karlin.mff.cuni.cz/~mj/pciutils.shtml
Original-Maintainer: Anibal Monsalve Salazar <anibal@debian. org>
Стоит заметить, что команда xargs выполняет подобную работу, что и подстановка вывода команд, т. е. передает в качестве аргументов одной команды результаты вывода другой.
В примере из листинга выше используются оба варианта, где подстановка вывода which выполняется командным интерпретатором, а вывод первой команды dpkg подставляется при помощи xargs, будучи предварительно отфильтрованным при помощи cut.
Подстановка вида $(command), в отличие от ‘command’, может без особых ухищрений многократно вкладываться сама в себя.
В примере из листинга ниже имя текущего пользователя, полученное при помощи команды id, подставляется в качестве аргумента команды поиска find для поиска его пустых файлов, список которых подставляется в качестве аргумента команды rm для их удаления.
Удаление пустых файлов пользователя
bender@ubuntu:~$ set -x
bender@ubuntu:~$ m -f $(find /tmp -user $(id -un) -size 0)
+++ id -un
++ find /tmp -user bender -size 0
find: ‘/tmp/-org.chromium.Chromium.N29MCl’; Отказано в доступе
find: ‘/tmp/-wine-1000’: Отказано в доступе
+ rm -f /tmp/wireshark_eth0_20181204134033_OMZ6wa /tmpwireshark_eth0_20181204134033_…
Важно понимать, что подстановки заменяются их вычисляемыми значениями в любом месте команды, как, например, в листинге ниже — в части имени архива, получаемого при помощи команды tar из файлов каталога ~/.config.
Архив с датой создания в имени
bender@ubuntu:-$ set -x
bender@ubuntu:~$ tar cjf dotconfig-$(date +%F).tbz2 ~/.conflg
+ tar cjf dotconfig — 2018 -12 -13. tbz2 /home/bender/. config
tar: Удаляется начальный ‘/’ из имен объектов
tar: /hone/bender/.config/chromium: файл изменился во время чтения
tar: /home/bender/.config/geeqie/.command: сокет проигнорирован