що мається на увазі підключенням STDOUT та STDIN?


10

Я читаю книгу, вона говорить:

Кожен процес має щонайменше три канали зв'язку: "стандартний вхід" (STDIN), "стандартний вихід" (STDOUT) та "стандартний помилку" (STDERR).

Більшість команд приймають свій вхід від STDIN і записують свій вихід у STDOUT. Вони пишуть повідомлення про помилки в STDERR. Ця умова дозволяє поєднувати рядкові команди, як будівельні блоки для створення складових трубопроводів.

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

Щоб підключити STDOUT однієї команди до STDIN іншої, використовуйте | символ, широко відомий як труба.

ps -ef | grep httpd

Отже, в основному, що це говорить, це те, що стандартний ввід - це команда, яка дозволяє користувачеві записувати файл, тоді як стандартний вихід - це команда, яка має вихід запису bash shell в оболонку, а стандартна помилка - це як вихід, але це лише викликається, коли є помилка у файловій системі. Потім ми дістаємось до частини, що з'єднує STDOUT і STDIN, і я втрачений.

Відповіді:


25

Стандартний вхід і стандартний вихід не є командами.

Уявіть команди як машини на заводі зі складальним рядком. Більшість машин розроблені з одним конвеєром для подачі даних і одним конвеєром для подачі даних; вони - стандартний вхід і стандартний вихід відповідно. Стандартна помилка - це отвір збоку машини, куди він може викидати відхилення.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

На схемі вище показаний конвеєр, який проходить через дві машини. Дані надходять із вхідного резервуара зліва, подаються на машину A, потім вихід передається далі до машини B (для якої вона вводиться), а вихід машини B зберігається у вихідному відрізці праворуч.

У уніксному плані це називається трубопроводом . Метафора - це водопровідна система: труба з'єднує машину A з машиною B. Синтаксис оболонки для трубопроводу вище

<input-file.txt commandA | commandB >output-file.txt

Символ < перенаправлення повідомляє оболонці підключити commandAстандартний вхід до файлу input-file.txtперед запуском commandA. (Ви можете поставити перенаправлення до або після назви команди.) Символ >перенаправлення повідомляє оболонці підключити commandBстандартний вихід до output-file.txt. Символ труби (" |") посередині повідомляє оболонці підключити commandAстандартний вихід до commandBстандартного входу перед їх запуском.

Команди можуть мати більше одного вводу та більше одного виходу, але це матеріал для іншого дня .


3
Візуальне дуже допомогло
JohnMerlino

Приємна аналогія. Я розумію концепцію потокового трубопроводу вже багато років, але якось ніхто ніколи не використовував аналогію фабрики / конвеєра, що робить його справді легко (і стисло) зрозумілим. Дякую!
Оуен Блекер

1
Чудова аналогія. Збираєтесь позичити цю, якщо ви не заперечуєте.
Тіві

Жилле, я задав запитання щодо твоєї фрази внизу: unix.stackexchange.com/q/96724/29146 . Ви могли б уточнити?
strugee

@Gilles - Чи можете ви включити приклад, який ілюструє можливість визначення перенаправлення до або після команди? Наприклад, чи може конвеєр читати як input-file.txt> commandA або input-file.txt <commandA?
Мотивовано

6

standard input is a command that allows user to write to a file

Не команда, а потік. Стандартні вхід і вихід - це як поштові скриньки. Коли програма запускається, надається вікно для отримання та скринька для відправки пошти. Зазвичай вхід надходить з клавіатури і вводиться у вікно, а пошта, розміщена у скриньці, закінчується на екрані вашого терміналу.

standard output is a command that has the bash shell write output to the shell

Програма насправді не знає, де стандартні бали. Коли ви передаєте від A до B (як у $ A | B), коли A поміщає пошту у вихідну скриньку, вона потрапляє у вікно B. B обробляє вхід і ставить власну пошту у вихідну скриньку, що ви бачите на терміналі.

Для відмови від метафори, як було сказано, стандартними введеннями / виведеннями є потоки. Поштова скринька або дескриптор файлу - це один кінець потоку. Труба - це підключення стандарту поза А до стандарту в Б.

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