Що означає символ "|" linux pipe? [дублікат]


23

Ось команда, яка сортує файли у папці у зворотному порядку

ls | sort -r

Що робить |символ у цій команді?

Що я справді шукаю тут - це високе (легко зрозуміле) пояснення труб для початківців Linux. Я бачу інші питання щодо труб тут на Superuser, але нічого, що викликає відповідь, що пояснює простими словами, що вони роблять, і чим вони відрізняються від перенаправлення ( символу >чи <символу).


7
Це не має нічого спільного з Linux (що є ядром). Труби взагалі є засобом перенаправлення вводу / виводу, в оболонці, як bash, він не відрізняється. Єдине, що особливе у a, |це те, що він не використовує імені, вихід з команди l-hand передається безпосередньо на вхід для команди з r-боку труби.
Андон М. Коулман

Для уроку історії з цього питання читайте на linfo.org/pipe.html
Фредрік

ls -1r(Зауважте, аргумент номер один) повинен дати аналогічний результат ls | sort -r.
Іван Чау

Мені подобається пояснити це так: Труба приймає вихід однієї команди і робить її корисною для наступної команди. Наприклад, ви можете зробити cat /somefile | grep cool. Це займе вихід деякого файлу і зробить його доступним для grep, а потім grep надрукує всі рядки зі словом cool у ньому.
JohnDoea

Відповіді:


26

Далі трохи спрощено, щоб допомогти новим користувачам.

Ну, по-перше, потрібно зрозуміти концепцію стандартного вводу та стандартного виводу.

У 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допомогою синтаксису таємничих символів, що включає амперсанди та дужки, про які я не знаю.


Зауважте, що це не властиво лише Linux або навіть POSIX. Більшість (усіх?) Оболонок у Windows теж роблять це. І, мабуть, інші ОС.
Боб

Я знаю, що концепція stdinі stdoutв Windows відрізняється, ніж під Linux, хоча, мабуть, не дуже з точки зору Windows cmd.exeабо Powershell.
ЛоуренсC

Мені досить цікаво, як це по-іншому - ви б не проти пояснити? Можливо, у чаті, якщо коментарі не є гарним місцем для цього.
Боб

1
Програми Win32, безумовно, мають стандартний вхід і вихід. Наприклад, ви можете отримати стандартний ввід, вихід або помилку обробки процесу за допомогою функції Win32 GetStdHandle(). Тривіально також перенаправляти стандартні потоки породженого [дочірнього] процесу за допомогою .NET, які я вважаю, що відображає функції Win32 (але я не впевнений у цьому на 100% - я не розробник Win32).
Боб

1
Ах, ось еквівалент Win32, встановивши відповідні параметри в STARTUPINFOструктурі для CreateProcess().
Боб

27

Якщо вам подобається перенаправлення виводу та входу, пояснення дійсно досить просто.

Command1 | Command2

робить те саме, що і

Command1 > tempfile
Command2 < tempfile

але без tempfile. Вихід з Command1прямо пов'язаний з входом Command2і передача відбувається в пам'яті.


Я можу помилитися, але я думаю, що тимплейф існує навіть у синтаксисі труби. У нього просто немає імені.
Теймір

3
Ні, це не є. Жодні операції з файловою системою не беруть участь під час передачі даних з однієї команди на вхід іншої команди.
Даніель Б

1
Хоча під DOS (і , швидше за все , Windows), тимчасовий файл буде створений по трубі. Не * nix, але різниці нічого не варто.
Джеремі Дж. Старчер

Я майже впевнений, що це неправильно. Монітор процесів не повідомляє про CreateFileабо не WriteFileвимагає повернути свою претензію. / edit: Це, звичайно, для частини Windows.
Даніель Б

3

Дійсно, якщо ви хочете знати, що роблять труби та різницю між> та |, тоді перейдіть до каталогу з великою кількістю файлів, і

з терміналу ls vs ls | more (або робити це з Windows з DIR та DIR | БІЛЬШЕ)

Якщо ви використовували> більше, ви побачите, що він створює файл, який називається «більше», а не надсилає висновок ls до команди «більше». Отже, якщо хтось зробив> більше, це, мабуть, помилиться, один не зробить> більше ви зробите> file1. Більше - добре відома команда.

<Like> також призначений для з'єднання команди та файлу, а не команди до команди. Але поки> надсилає вихід команди в файл, <відправляє файл як вхід до команди. Я рідко використовую <як я зазвичай використовую файл cat1 | щоб відправити команду виводу файлу.

$ grep a <file1 abc

$ cat file1 | grep abc

grep з 2 параметрами має форму шаблону файлу grep. grep з одним параметром є схемою grep. І ви можете надіслати йому файл, відправивши до нього вміст файлу або скориставшись <. Якщо ви користуєтесь <, спочатку ви пишете ім'я команди, а потім ім'я файла після команди <файл <. Якщо використовується | для передачі вмісту файлу ви використовуєте файл cat1 | командування.

Також багато команд все одно приймають файл як вхід, так що файли1 працюватимуть так само, як і cat file1 | grep a і grep a <file1.

Я робив труби (|) та> на DOS ще 15 років тому.

Підсумувати, як | відрізняється від <і> - Труба розташована між двома командами <і> sit між командою та файлом. Виводиться у файл. <Вводиться з файлу.


3

Характер труби ( |) з'єднує вихід однієї програми з входом іншої.

У цьому прикладі echoдрукується слово hello, і wc -cчисельність його вводу символів:

echo hello | wc -c

Я думаю, ви повинні відразу сказати, що луна виведе "привіт \ n". Ви не говорите ОП на навчання, ви говорите це всім, хто прочитає вашу відповідь. Навіщо примножувати цю марну часу?
Родріго

Дякую за відгук, я скоротив свою відповідь.
bbaassssiiee

2

Щоб зрозуміти це, спробуйте самі:

sort -r

Тепер ви звисаєте курсором, і це нічого не робить. Що станеться, якщо ви введете деякі дані?

1
2
3
5
4

Ще нічого, правда? Тепер натисніть ctrl + D

5
4
3
2
1

Отже, що це таке, він бере вхід (те, що ви ввели), щось робить з ним (сортує) і повертає його як вихід. lsКоманда не приймає вхідний сигнал, він генерує тільки вихід. Символ труби приймає вихід з lsі подає його як вхід до sortкоманди.

>не подає вихід до програми, але зберігає вихід у вигляді файлу. <використовує файл як вхід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.