Далі трохи спрощено, щоб допомогти новим користувачам.
Ну, по-перше, потрібно зрозуміти концепцію стандартного вводу та стандартного виводу.
У Linux та інших операційних системах, схожих на UNIX, кожен процес має стандартний вхід ( stdin
) та стандартний вихід ( stdout
). Звичайна ситуація - stdin
це ваша клавіатура і stdout
це ваш екран або вікно терміналу.
Тож коли ви запустите ls
, він кине його на вихід stdout
. Якщо ви нічого не зробите, він перейде до вашого екрана чи вікна терміналу, і ви його переглянете.
Тепер деякі команди Linux взаємодіють з користувачем і використовують stdin
для цього, ваш текстовий редактор є одним із таких. Він читає, stdin
щоб прийняти ваші натискання клавіш, робити якісь дії, а потім записувати речі stdout
.
Однак існують також неінтерактивні команди або «фільтруючі» команди, які НЕ працюють в інтерактивному режимі, але хочуть купу даних. Ці команди візьмуть все, що stdin
є, зробіть щось із цим, а потім киньте йогоstdout
Давайте розглянемо ще одну команду під назвою du
- підставки для використання диска. du /usr
, наприклад, буде надруковано ( stdout
як і будь-яка інша команда Linux) список усіх файлів у цьому каталозі та його розмір:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
Як ви можете відразу сказати, що він не сортується, і, ймовірно, ви хочете, щоб він був відсортований за розміром.
sort
є однією з тих команд «фільтрування», які займуть купу матеріалів stdin
і сортують її.
Отже, якщо ми це зробимо:
# du /usr | sort -nr
ми отримуємо це, що трохи краще:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
Тепер ви можете бачити, що "труба" з'єднує stdout
одну команду stdin
з іншою. Зазвичай ви будете використовувати його в таких ситуаціях, коли ви хочете фільтрувати, сортувати або іншим чином маніпулювати результатами команди. Вони можуть бути каскадними, якщо ви хочете обробити висновок за допомогою декількох команд фільтруючого типу.
Якщо ви введете sort
його самостійно, він все ще намагатиметься читати з нього stdin
. Оскільки stdin
він підключений до вашої клавіатури, він буде чекати, коли ви будете вводити та обробляти речі, поки не натиснете Control-D. Це не підкаже вам, оскільки це не дійсно призначене для інтерактивного використання.
Програма може визначити stdin
, інтерактивна вона чи ні, тому деякі програми можуть діяти інакше, якщо ви видаєте їх самостійно або в кінці труби.
Крім того, трубопровідна програма, яка працює лише в інтерактивному режимі, як-от vi
, призведе до того, що у вас буде поганий час.
Труби відрізняються від перенаправлення тим, що дані переміщуються з однієї команди в іншу, не зберігаючись ніде. Отже, у наведеному вище прикладі du
вихідні дані ніде не зберігаються. Більшу частину часу ви не хочете цього робити з трубами, тому що причиною використання труб є певна обробка результатів команди - але є команда, tee
яка дозволяє вам мати ваш пиріг і їсти його теж, він буде копіювати те , що він отримує від stdin
обом stdout
і файлу за вашим вибором. Ви також можете це зробити за bash
допомогою синтаксису таємничих символів, що включає амперсанди та дужки, про які я не знаю.
|
це те, що він не використовує імені, вихід з команди l-hand передається безпосередньо на вхід для команди з r-боку труби.