Подстановки вывода команд Linux

Еще одним видом подстановок, выполняемых командным интерпретатором, являются подстановки вывода команд. Конструкции вида $(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: сокет проигнорирован

Добавить комментарий