Конвейеры командной строки
10.2 Конвейеры командной строки
Символ вертикальной черты | можно использовать для отправки вывода одной команды другой. Как правило, когда команда имеет выходные данные или генерирует ошибку, выходные данные отображаются на экране; однако это не обязательно так. Вместо вывода на экран вывод одной команды становится вводом для следующей команды. Этот инструмент может быть мощным, особенно при поиске конкретных данных; конвейер часто используется для уточнения результатов исходной команды.
В предыдущих примерах командам headи tailбыли переданы файлы в качестве аргументов для работы. Однако символ вертикальной черты позволяет использовать эти команды не только для файлов, но и для вывода других команд. Это может быть полезно при перечислении большого каталога, например /etcкаталога:
sysadmin@localhost:~$ ls /etc
X11 gss mke2fs.conf rpc
adduser.conf host.conf modprobe.d rsyslog.conf
alternatives hostname modules rsyslog.d
apparmor hosts modules-load.d securetty
apparmor.d hosts.allow motd security
apt hosts.deny mtab selinux
bash.bashrc init.d nanorc services
bind initramfs-tools netplan shadow
bindresvport.blacklist inputrc network shadow-
binfmt.d insserv.conf.d networks shells
ca-certificates iproute2 newt skel
ca-certificates.conf issue nsswitch.conf ssh
calendar issue.net opt ssl
console-setup kernel os-release subgid
cron.d ld.so.cache pam.conf subgid-
cron.daily ld.so.conf pam.d subuid
cron.hourly ld.so.conf.d passwd subuid-
cron.monthly ldap passwd- sudoers
cron.weekly legal perl sudoers.d
crontab libaudit.conf pinforc sysctl.conf
dbus-1 locale.alias ppp sysctl.d
debconf.conf locale.gen profile systemd
debian_version localtime profile.d terminfo
default logcheck protocols timezone
deluser.conf login.defs python3 tmpfiles.d
depmod.d logrotate.conf python3.6 ucf.conf
dhcp logrotate.d rc0.d udev
dpkg lsb-release rc1.d ufw
environment machine-id rc2.d update-motd.d
fstab magic rc3.d updatedb.conf
gai.conf magic.mime rc4.d vim
groff mailcap rc5.d vtrgb
group mailcap.order rc6.d wgetrc
group- manpath.config rcS.d xdg
gshadow mc resolv.conf
gshadow- mime.types rmtПредыдущая команда перечисляет большое количество файлов. Если вы выполните это в нашем терминале, вывод будет обрезан и может быть просмотрен только при прокрутке вверх. Чтобы упростить просмотр начала вывода, передайте его в headкоманду. В следующем примере отображаются только первые десять строк:
Полный вывод команды lsпередается команде headоболочкой вместо вывода на экран. Команда headпринимает этот вывод от lsкоманды в качестве входных данных, а вывод headзатем выводится на экран.
Несколько каналов могут использоваться последовательно для связывания нескольких команд вместе. Если три команды передаются вместе, выходные данные первой команды передаются второй команде. Затем вывод второй команды передается третьей команде. Затем вывод третьей команды будет напечатан на экране.
Важно тщательно выбирать порядок, в котором команды передаются по каналу, так как каждая команда видит только ввод из предыдущей команды. Примеры ниже иллюстрируют это с помощью nlкоманды, которая добавляет номера строк к выходным данным. В первом примере nlкоманда используется для нумерации строк вывода предыдущей lsкоманды:
Обратите внимание, что в следующем примере lsкоманда выполняется первой, и ее вывод отправляется команде nl, нумеруя все строки из вывода команды ls. Затем tailкоманда выполняется, отображая последние пять строк из вывода команды nl:
Сравните вывод выше со следующим примером:
Обратите внимание, как отличаются номера строк.
Во втором примере вывод команды lsсначала отправляется команде tail, которая захватывает только последние пять строк вывода. Затем tailкоманда отправляет эти пять строк команде nl, которая их нумерует 1- 5.
Конвейеры могут быть мощными, но необходимо учитывать, как команды передаются по конвейеру, чтобы гарантировать отображение желаемого вывода.
Last updated