Конвейеры командной строки
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
команду. В следующем примере отображаются только первые десять строк:
sysadmin@localhost:~$ ls /etc | head
X11
adduser.conf
alternatives
apparmor
apparmor.d
apt
bash.bashrc
bind
bindresvport.blacklist
binfmt.d
Полный вывод команды ls
передается команде head
оболочкой вместо вывода на экран. Команда head
принимает этот вывод от ls
команды в качестве входных данных, а вывод head
затем выводится на экран.
Несколько каналов могут использоваться последовательно для связывания нескольких команд вместе. Если три команды передаются вместе, выходные данные первой команды передаются второй команде. Затем вывод второй команды передается третьей команде. Затем вывод третьей команды будет напечатан на экране.
Важно тщательно выбирать порядок, в котором команды передаются по каналу, так как каждая команда видит только ввод из предыдущей команды. Примеры ниже иллюстрируют это с помощью nl
команды, которая добавляет номера строк к выходным данным. В первом примере nl
команда используется для нумерации строк вывода предыдущей ls
команды:
sysadmin@localhost:~$ ls /etc/ssh | nl
1 moduli
2 ssh_config
3 ssh_host_ecdsa_key
4 ssh_host_ecdsa_key.pub
5 ssh_host_ed25519_key
6 ssh_host_ed25519_key.pub
7 ssh_host_rsa_key
8 ssh_host_rsa_key.pub
9 ssh_import_id
10 sshd_config
Обратите внимание, что в следующем примере ls
команда выполняется первой, и ее вывод отправляется команде nl
, нумеруя все строки из вывода команды ls
. Затем tail
команда выполняется, отображая последние пять строк из вывода команды nl
:
sysadmin@localhost:~$ ls /etc/ssh | nl | tail -5
6 ssh_host_ed25519_key.pub
7 ssh_host_rsa_key
8 ssh_host_rsa_key.pub
9 ssh_import_id
10 sshd_config
Сравните вывод выше со следующим примером:
sysadmin@localhost:~$ ls /etc/ssh | tail -5 | nl
1 ssh_host_ed25519_key.pub
2 ssh_host_rsa_key
3 ssh_host_rsa_key.pub
4 ssh_import_id
5 sshd_config
Обратите внимание, как отличаются номера строк.
Во втором примере вывод команды ls
сначала отправляется команде tail
, которая захватывает только последние пять строк вывода. Затем tail
команда отправляет эти пять строк команде nl
, которая их нумерует 1
- 5
.
Конвейеры могут быть мощными, но необходимо учитывать, как команды передаются по конвейеру, чтобы гарантировать отображение желаемого вывода.
Last updated