В интерфейсе командной строки есть очень полезная возможность перенаправления (переадресации) ввода и вывода (англ. термин I/O Redirection). Как мы уже заметили, многие программы выводят данные на экран. А ввод данных в терминале осуществляется с клавиатуры. С помощью специальных обозначений можно перенаправить вывод многих команд в файлы или иные устройства вывода (например, распечатать на принтере). Тоже самое и со вводом информации, вместо ввода данных с клавиатуры, для многих программ можно задать считывание символов их файла. Кроме того, можно даже вывод одной программы передать на ввод другой программе 😉
Разморозим нашу виртуальную машину и посмотрим как все это работает. В домашней директории создадим директорию test и перейдем в нее. Это позволит нам после завершения наших проб удалить весь мусор, стерев всю директорию test, как мы это сделали в позапрошлый раз.
1 2 3 4 5 |
Стандартный вывод
Большинство программ, работающих в интерфейсе командной строки, отображают результаты, направляя их на специальное приспособление, называемое стандартным выводом. Все, что отправляется в стандартный вывод, обычно отображается на экране. Но вывод можно перенаправить. Для его перенаправления в определенный файл, существует специальное обозначение «>» (знак больше), после которого указывается имя файла. В таком случае вывод результатов работы команды записывается в файл и на экран не выводится. Если файла с указанным именем не существует, то он будет создан. В противном случае, старое содержание файла будет стерто. Для записи в конец существующего файла вместо «>» следует использовать «>>» (два знака больше). Если файл отсутствует, то он будет создан, в противном случае вывод будет дописан в конец существующего файла.
Посмотрим как это работает. Для этого перенаправим вывод команды ls в файлы. А после посмотрим их содержание с помощью программы для чтения текстовых файлов less.
1 2 3 4 5 6 7 8 |
[[email protected] test]$ ls /usr/bin >bin.txt [[email protected] test]$ less bin.txt [[email protected] test]$ ls /usr/local >>usr.txt [[email protected] test]$ ls /usr/sbin >>usr.txt [[email protected] test]$ less usr.txt [[email protected] test]$ |
Перенаправление вывода всегда указывается после всех параметров и аргументов программы (в конце команды).
Помимо текстовой информации, в стандартный вывод могут быть выведены двоичные (не читаемые человеком данные). В таком случае, при обычном вызове программы, которая выдает подобный результат, они появятся на экране, что не имеет смысла, так как прочитать (понять) результат работы программы мы не сможем 🙁 Предполагается, что подобный вывод будет перенаправлен для записи в файл или на ввод другой программе. Это очень удобно, ведь программа лишь обрабатывает данные, а после мы сами указываем, куда отправить (или записать) результат, без необходимости предварительной записи его во временные файлы. С конкретными примерами подобного использования мы познакомимся после того, как разберемся с перенаправлением ввода.
Стандартный ввод
Большинство программ, работающих в интерфейсе командной строки, ожидают ввод данных от пользователя с так называемого приспособления стандартный ввод. Обычно, все, что набирается на клавиатуре, доступно для считывания программе из стандартного ввода. Но его можно перенаправить. Чтобы перенаправить ввод из файла, существует специальное обозначение «<» (знак меньше) после которого следует указать имя файла. При перенаправлении ввода, вместо того, чтобы считывать символы с клавиатуры (стандартного устройства ввода), программа считывает их их указанного источника (файла).
Чтобы понять, удобство переадресации ввода, вначале познакомимся с программой sort, которая считывает строки и выводит их, отсортировав по алфавиту. Если быть совсем честным, то программа sort умеет считывать данные из файла, если указать его имя, но мы не будем в данном случае этим пользоваться. Ведь нас интересует разобраться как работает перенаправление ввода.
Вначале запустим программу sort и введем несколько строк. После завершения ввода воспользуемся комбинацией Ctrl+D, которая вставляет так называемый символ (указатель) конца данных (файла).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[[email protected] test]$ sort 123456 32525 afegerger sfgeg asrwet dsggare asfweg sfegsd 123456 32525 afegerger asfweg asrwet dsggare sfegsd sfgeg [[email protected] test]$ |
Как видим, программа отсортировала строки в алфавитном порядке (вначале следуют цифры). Если присмотреться, то не очень понятно, где начинается вывод результата, так как сразу после того, как мы закончили вводить данные, программа вывела результат.
Если бы мы направили вывод данных в файл, то разобраться бы было проще, так как на экране мы бы видели лишь только то, что ввели с клавиатуры, а результат был бы сохранен в файл.
Аналогично было бы, если бы мы сортировали строки из файла. На экране был бы отображен лишь результат сортировки. Попробуем отсортировать строки в файле usr.txt, в который мы сохранили вывод результата программы ls после двух запусков. Как мы заметили, программа ls выводит результат в отсортированном виде, но мы запускали ее дважды и получили два отсортированных списка в файле usr.txt. Сейчас нам нужно отсортировать все строки файла usr.txt между собой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 |
[[email protected] test]$ sort < usr.txt abrt-auto-reporting abrt-configuration abrtd abrt-dbus abrt-harvest-pstoreoops abrt-harvest-vmcore abrt-install-ccpp-hook abrt-server accept accessdb accton addgnupghome addpart adduser adsl-start adsl-stop agetty alsactl alternatives anacron applygnupgdefaults arp arpaname arpd arping atd atmaddr atmarp atmarpd atmloop atmsigd atmtcp atrun audispd auditctl auditd augenrules aureport ausearch authconfig authconfig-tui autrace avahi-autoipd avahi-daemon avcstat avmcapictrl badblocks bin biosdecode biosdevname blkdeactivate blkdiscard blkid blkmapd blockdev br2684ctl brctl bridge btrfs btrfsck btrfs-convert btrfs-debug-tree btrfs-find-root btrfs-image btrfs-map-logical btrfs-show-super btrfstune btrfs-zero-log build-locale-archive bus cacertdir_rehash cache_check cache_dump cache_repair cache_restore capiinit capsh cbq cfdisk cgdisk chat chcpu chkconfig chpasswd chronyd chroot cifs.idmap cifs.upcall clock clockdiff collie consoletype convertquota corosync corosync-cfgtool corosync-cmapctl corosync-cpgtool corosync-keygen corosync-notifyd corosync-quorumtool cracklib-check cracklib-format cracklib-packer cracklib-unpacker crda create-cracklib-dict crond cryptsetup ctrlaltdel ctstat cupsaccept cupsaddsmb cups-browsed cupsctl cupsd cupsdisable cupsenable cupsfilter cups-genppd.5.2 cups-genppdupdate cupsreject ddns-confgen debugfs delpart depmod dhclient dhclient-script dmeventd dmidecode dmsetup dnsmasq dnssec-checkds dnssec-coverage dnssec-dsfromkey dnssec-keyfromlabel dnssec-keygen dnssec-revoke dnssec-settime dnssec-signzone dnssec-verify dongle_attach dosfsck dosfslabel dracut dump dump-acct dumpe2fs dump-utmp e2freefrag e2fsck e2image e2label e2undo e4defrag eapol_test ebtables ebtables-restore ebtables-save edquota enitune era_check era_dump era_invalidate esi etc ether-wake ethtool exportfs faillock fatlabel fdformat fdisk filefrag findchip findfs firewalld fixfiles fixparts foomatic-addpjloptions foomatic-cleanupdrivers foomatic-extract-text foomatic-fix-xml foomatic-getpjloptions foomatic-kitload foomatic-nonumericalids foomatic-preferred-driver foomatic-printermap-to-gutenprint-xml foomatic-replaceoldprinterids fsadm fsck fsck.btrfs fsck.cramfs fsck.ext2 fsck.ext3 fsck.ext4 fsck.ext4dev fsck.fat fsck.minix fsck.msdos fsck.ntfs fsck.vfat fsck.xfs fsfreeze fstrim fuser fxload games gdisk gdm genhomedircon genhostid genl genl-ctrl-list genrandom getcap getenforce getpcaps getsebool glibc_post_upgrade.i686 glusterfs glusterfsd groupadd groupdel groupmems groupmod grpck grpconv grpunconv grub2-bios-setup grub2-install grub2-mkconfig grub2-ofpathname grub2-probe grub2-reboot grub2-set-default grub2-sparc64-setup grubby halt hardlink hediag hisaxctrl hwclock icnctrl iconvconfig iconvconfig.i686 ifcfg ifconfig ifdown ifenslave ifrename ifstat ifup ilmid ilmidiag imon imontty include init insmod install-info installkernel intel-microcode2ucode ip ip6tables ip6tables-restore ip6tables-save ipmaddr ipppd ipppstats iprofd ipsec iptables iptables-restore iptables-save iptstate iptunnel irattach irdadump irdaping irnetd irqbalance isc-hmac-fixup iscsiadm iscsid iscsi-iname iscsistart iscsiuio isdnctrl isdnlog iw iwconfig iwevent iwgetid iwlist iwpriv iwspy kdump kexec key.dns_resolver killall5 kpartx lchage ldattach ldconfig lecs les lgroupadd lgroupdel lgroupmod lib libexec libvirtd lid lnewusers lnstat load_policy lockdev logrotate logsave loopctrl losetup lpadmin lpasswd lpc lpc.cups lpinfo lpmove lsmod lsof lspci lspcmcia luseradd luserdel lusermod lvchange lvconvert lvcreate lvdisplay lvextend lvm lvmchange lvmconf lvmdiskscan lvmdump lvmetad lvmsadc lvmsar lvreduce lvremove lvrename lvresize lvs lvscan makedumpfile matchpathcon mcelog mdadm mdmon mii-diag mii-tool mkdict mkdosfs mkdumprd mke2fs mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.fat mkfs.minix mkfs.msdos mkfs.ntfs mkfs.vfat mkfs.xfs mkhomedir_helper mklost+found mkntfs mkswap mkzonedb ModemManager modinfo modprobe mount.cifs mount.fuse mount.glusterfs mount.lowntfs-3g mount.nfs mount.nfs4 mount.ntfs mount.ntfs-3g mount.ntfs-fuse mountstats mpcd mtr named-checkzone named-compilezone nameif netreport netscsid NetworkManager new-kernel-pkg newusers nfsdcltrack nfsidmap nfsiostat nfsstat nl-class-add nl-class-delete nl-classid-lookup nl-class-list nl-cls-add nl-cls-delete nl-cls-list nl-link-list nl-pktloc-lookup nl-qdisc-add nl-qdisc-delete nl-qdisc-list nologin nsec3hash nstat ntfsclone ntfscp ntfslabel ntfsresize ntfsundelete ntsysv oddjobd openconnect openvpn osd_login ownership packer pam_console_apply pam_tally2 pam_timestamp_check parted partprobe partx pcbitctl pccardctl pcscd pidof ping6 pivot_root plipconfig pluginviewer plymouthd plymouth-set-default-theme pm-hibernate pm-powersave pm-suspend pm-suspend-hybrid pm-utils-bugreport-info.sh poweroff pppd pppdump pppoe pppoe-connect pppoe-discovery pppoe-relay pppoe-server pppoe-setup pppoe-sniff pppoe-start pppoe-status pppoe-stop pppstats ppp-watch pptp prelink pvchange pvck pvcreate pvdisplay pvmove pvremove pvresize pvs pvscan pwck pwconv pwhistory_helper pwunconv qb-blackbox quot quotacheck quotaoff quotaon quotastats radvd radvdump raid-check rcapid rdisc rdistd rdump readprofile realm reboot regdbdump reject repquota request-key resize2fs resizepart restore restorecon rhcrashkernel-param rmmod rmt rngd route routef routel rpcbind rpcdebug rpc.gssd rpc.idmapd rpcinfo rpc.mountd rpc.nfsd rpc.rquotad rpc.statd rpc.svcgssd rrestore rsyslogd rtacct rtcwake rtkitctl rtmon rtpr rtstat runlevel runuser sa safe_finger saned saslauthd sasldblistusers2 saslpasswd2 sbin sedispatch sefcontext_compile selinuxconlist selinuxdefcon selinuxenabled selinuxexeccon semanage semodule sendmail sendmail.ssmtp service sestatus setcap setenforce setfiles setpci setquota setregdomain setroubleshootd setsebool setup sfdisk sgdisk share sheep showmount shutdown skdump sktest slattach sln smartctl smartd sm-notify sosreport spice-vdagentd src ss sshd sshd-keygen ssmtp sss_cache sssd start-statd sulogin sushell swaplabel swapoff swapon switch_root sysctl sys-unconfig tc tcpd tcpdmatch tcpdump tcpslice tcsd telinit testsaslauthd thin_check thin_dump thin_metadata_size thin_repair thin_restore thin_rmap tmpwatch tracepath tracepath6 try-from tune2fs udevadm umount.nfs umount.nfs4 umount.udisks2 unbound-anchor unix_chkpwd unix_update update-alternatives update-pciids update-smart-drivedb usb_modeswitch usb_modeswitch_dispatcher usbmuxd useradd userdel userhelper usermod usernetctl vboxd vconfig vgcfgbackup vgcfgrestore vgchange vgck vgconvert vgcreate vgdisplay vgexport vgextend vgimport vgimportclone vgmerge vgmknodes vgreduce vgremove vgrename vgs vgscan vgsplit via_regs_dump vigr vipw virtlockd visudo vmcore-dmesg vpddecode vpnc vpnc-disconnect weak-modules wipefs wpa_cli wpa_passphrase wpa_supplicant xfs_admin xfs_bmap xfs_copy xfs_db xfs_estimate xfs_freeze xfs_fsr xfs_growfs xfs_info xfs_io xfs_logprint xfs_mdrestore xfs_metadump xfs_mkfile xfs_ncheck xfs_quota xfs_repair xfs_rtcp xl2tpd xl2tpd-control xqmstats xtables-multi yum-complete-transaction yumdb zdump zeppelin zic zntune [[email protected] test]$ |
Перенаправление ввода всегда указывается после всех параметров и аргументов программы (в конце команды).
Можно сразу перенаправить и ввод, и вывод. Сохраним отсортированный выше список в файле usr-sorted.txt и посмотрим результат через less.
1 2 3 4 5 |
[[email protected] test]$ sort < usr.txt > usr-sorted.txt [[email protected] test]$ less usr-sorted.txt [[email protected] test]$ |
При одновременном указании переадресации ввода и вывода, порядок в котором они указываются не имеет значения. Можно вначале указать либо перенаправление ввода, а затем вывода, либо наоборот 🙂
Перевод вывода на ввод
Перенаправлять стандартные ввод и вывод в файлы мы уже умеем. Но еще можно вывод одной команды подать на ввод другой. Это наиболее полезный и удобный функционал переадресации ввода вывода. Таким образом можно объединить в цепочку несколько команд, последовательно создавая канал между выводом одной команды и вводом следующей. Такая переадресация ввода вывода одной команды в другую называется каналом (англ. pipeline или pipe). Для присоединение ввода команды к выводу другой команды, используется обозначение «|» (вертикальная черта, «труба» (англ. pipe)). После полного описания команды, вывод которой следует перенаправить на ввод другой команде, ставится символ «|» (вертикальная черта) и следует описание второй команды. Цепочка может содержать сразу несколько команд.
Посмотрим как это работает. Если мы помним, в директории /usr/bin слишком много файлов. Мы хотим посмотреть детальную информацию по каждому, но список не помещается на экране. Для решения подобной задачи мы перенаправляли вывод команды ls в файл, а затем открывали его через удобную программу для просмотра текстовых файлов less. А ведь можно сразу без сохранения результата в файл открыть его через less. Сделаем это.
1 2 3 |
Теперь мы можем видеть весь результат и перемещаться по нему при помощи прокрутки в less и даже выполнять поиск текста. Для выхода из less нажмем клавишу «q». Я надеюсь, к текущему моменту мы запомнили нужные нам команды управления, особенно выход из less, поэтому далее про «q» упоминаний не будет.
Не забудем удалить созданную директорию test. Все помнят как это сделать? Если возникают сложности, советую вновь ознакомиться и понять основные методы воздействия на файлы и директории в Linux.
Более подробно о применении цепочек из команд будет рассказано в следующих материалах. А пока вновь заморозим виртуальную машину. О заморозке и разморозке в будущем я тоже упоминать не буду, как и о многом очевидном. И не бойтесь отклоняться от инструкций в материалах и ставить опыты с командной строкой — это только пойдет на пользу 🙂