Пренасочване на входен изход в примери за Linux/Unix

⚡ Умно обобщение

Пренасочването в Linux и Unix се променя, когато командата чете вход или изпраща изход, размянаping клавиатурата и екрана за файлове или устройства, използващи оператори като знака „по-голямо от“, знака „по-малко от“ и оператора за добавяне.

  • 🔀 Пренасочване: Пренасочването променя стандартния вход или изход на команда от клавиатурата и екрана към файл или устройство.
  • ➡️ Изход: Операторът > записва изхода във файл, докато >> добавя към съществуващ файл, без да го изтрива.
  • ⬅️ Вход: Операторът < подава файл в командата като стандартен вход, вместо от клавиатурата.
  • 🔢 Файлови дескриптори: Всеки отворен файл получава номер: 0 за stdin, 1 за stdout и 2 за stderr.
  • ⚠️ Пренасочване при грешка: Използването на 2> изпраща съобщения за грешки в отделен файл, за да не претрупват нормалния изход.
  • 🔗 Комбинирани потоци: Синтаксисът 2>&1 насочва стандартната грешка към същата цел като стандартния изход.
  • 🤖 Помощ с изкуствен интелект: AI асистентите и GitHub Copilot могат да създават и обясняват команди за пренасочване и shell скриптове.

Пренасочване на вход/изход в Linux и Unix с примери

Пренасочването е една от най-полезните функции на Linux и Unix shell, защото ви позволява да решите къде дадена команда чете входните си данни и къде изпраща изходните си данни. Тази страница обяснява изходните, входните и пренасочването на грешки с реализирани примери.

Какво е пренасочване?

Пренасочването е функция в Linux, която позволява при изпълнение на команда да се променят стандартните входни и изходни устройства. Основният работен процес на всеки... Linux команда е, че приема вход и дава изход.

  • Стандартното устройство за въвеждане (stdin) е клавиатурата.
  • Устройството за стандартен изход (stdout) е екранът.

С пренасочване, стандартният вход и изход по-горе могат да бъдат променени.

Пренасочване на изхода

Графиката по-долу отбелязва началото на примерите за пренасочване на изхода.

Графика на заглавието на секцията за пренасочване на изхода

Символът '>' се използва за пренасочване на изхода (STDOUT).

Пример:

ls -al > listings

Тук изходът на командата ls -al се пренасочва към файла „listings“ вместо към екрана ви. Снимката на екрана по-долу показва резултата.

Терминал, показващ пренасочването на списъка с командата ls -al към файла със списъци

Забележка: Използвайте правилното име на файл, когато пренасочвате изхода на командата към файл. Ако вече съществува файл със същото име, пренасочената команда изтрива съдържанието му и след това го презаписва.

Ако не искате даден файл да бъде презаписан, но искате да добавите още съдържание към съществуващ файл, използвайте оператора '>>'. Екранната снимка по-долу показва съдържание, добавено с '>>'.

Терминал, показващ изхода на командата, добавен към съществуващ файл с оператора двойно по-голямо от

Можете да пренасочвате стандартния изход не само към файлове, но и към устройства.

$ cat music.mp3 > /dev/audio

Командата cat чете музикалния файл.mp3 и изпраща изхода към /dev/audio, което е аудио устройството. Ако звуковата конфигурация на вашия компютър е правилна, тази команда възпроизвежда музикалния файл.mp3.

Пренасочване на входа

Графиката по-долу представя пренасочване на входа.

Графика на заглавието на секцията за пренасочване на входа

Символът '<' се използва за пренасочване на вход (STDIN).

Пример: Програмата за поща в Linux може да ви помогне да изпращате имейли от терминала.

Можете да въведете съдържанието на имейла, като използвате клавиатурата, стандартното устройство за въвеждане. Но ако искате да прикачите файл към имейла, можете да използвате оператора за пренасочване на въвеждане в следния формат.

mail -s "Subject" to-address < Filename

Снимката на екрана по-долу показва командата mail, която чете файл като входен файл.

команда за поща, използваща пренасочване на входа, за да прикачи файл към имейл

Това прикачва файла към имейла и той се изпраща на получателя.

Примерите по-горе бяха прости. Сега разгледайте някои усъвършенствани техники за пренасочване, които използват файлови дескриптори.

досие Descriptors (FD)

В Linux и Unix всичко е файл. Обикновените файлове, директориите и дори устройствата са файлове. Всеки файл има свързан номер, наречен файлов дескриптор (ФД).

Диаграмата по-долу показва стандартните потоци и техните файлови дескриптори.

Диаграма на стандартните входни, изходни и грешки потоци и техните файлови дескриптори

Вашият екран също има файлов дескриптор. Когато се изпълни програма, изходът се изпраща към файловия дескриптор на екрана и вие виждате изхода на програмата на монитора си. Ако изходът беше изпратен към файловия дескриптор на принтера, изходът на програмата щеше да бъде отпечатан.

Пренасочване на грешки

Всеки път, когато изпълнявате програма или команда в терминала, винаги са отворени три файла, а именно стандартен вход, стандартен изход и стандартен файл за грешки.

Тези файлове са винаги налични, когато се изпълнява програма. Както беше обяснено по-рано, с всеки от тези файлове е свързан файлов дескриптор.

досие досие Descriptor
Стандартен вход STDIN 0
Стандартен изход STDOUT 1
Стандартна грешка STDERR 2

По подразбиране потокът от грешки се показва на екрана. Пренасочването на грешки насочва грешките към файл, различен от екрана.

Защо пренасочване на грешки?

Пренасочването на грешки е една от много популярните функции на Unix и Linux.

Често срещаните потребители на Unix знаят, че много команди дават огромно количество грешки. Например, при търсене на файлове, човек обикновено получава разрешение отказ на грешки, които обикновено не помагат на човека, който търси определен файл. Докато изпълнявате shell скриптове, често не искате съобщенията за грешки да претрупват нормалния изход на програмата.

Решението е да се пренасочат съобщенията за грешки към файл.

Пример 1

$ myprogram 2>errorsfile

Снимката на екрана по-долу показва тази команда в терминала.

Терминал, изпълняващ myprogram със стандартна грешка, пренасочена към файла errorsfile

По-горе изпълняваме програма с име myprogram. Файловият дескриптор за стандартна грешка е 2. Използвайки „2>“, пренасочваме изхода за грешка към файл с име „errorsfile“. По този начин изходът на програмата не е претрупан с грешки.

Пример 2

Ето още един пример, който използва оператора find.

find . -name 'my*' 2>error.log

Използвайки командата find, търсим в текущата директория „.“ файл, чието име започва с „my“, и изпращаме всички грешки към error.log.

Пример 3: Нека разгледаме по-сложен пример.

Сървърните администратори често изброяват директории и съхраняват както изходните данни за грешки, така и стандартния изход във файл, който може да бъде обработен по-късно. Ето командата.

ls Documents ABC> dirlist 2>&1

Диаграмата по-долу показва как и двата потока се записват в един файл.

Диаграма на стандартния изход и стандартния изход за грешки, пренасочени към списъка с директории с файлове

Тук:

  • 2>&1 означава, че STDERR се пренасочва към същата цел като STDOUT (която е списъкът с директории на файловете).
  • Изходът за грешка се пренасочва към стандартния изход, който от своя страна се пренасочва към списъка с директории на файла. Следователно и двата потока се записват в списъка с директории на файла.

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

Диаграма, обобщаваща входните, изходните и пренасочващите операции при грешки в Linux и Unix

Въпроси и Отговори

A тръба (|) изпраща изхода на една команда директно към друга команда като неин вход. Пренасочването вместо това свързва команда с файл или устройство, записвайки изход в него или четейки вход от него. Каналните връзки свързват команди; пренасочването свързва команда с файл.

Операторът > записва изхода на командата във файл, замествайки всяко съществуващо съдържание. Операторът >> добавя изхода в края на файла, запазвайкиping какво вече е там. Използвайте >> винаги, когато искате да добавите към файл, вместо да го презапишете.

/dev/null е специален файл, който изтрива всичко записано в него. Добавянето на 2>/dev/null към команда пренасочва съобщенията за грешки към този файл, като ги изхвърля тихо, така че на екрана се показва само нормален изход. Това е често срещан начин за скриване на нежелани грешки.

Командата tee чете от стандартния вход и записва данните едновременно на екрана и в един или повече файлове, например ls -al | tee listing.txt. Тя ви позволява да запишете изхода на командата във файл, докато все още го виждате на екрана.

Документът here използва оператора <<, за да подаде няколко реда вграден текст в командата като вход, завършващ с избрана от вас ключова дума. Това е удобно в shell скриптове за подаване на многоредов вход, като например тяло на имейл, без отделен файл.

Използвайте синтаксиса 2>&1 след пренасочване на изхода, както в command > file 2>&1, така че стандартната грешка следва стандартния изход във файла. В съвременния Bash съкратената команда &> file прави същото. Редът е важен: поставете 2>&1 след пренасочването на изхода.

Асистентите с изкуствен интелект могат да превърнат заявка на обикновен английски език в правилната команда за пренасочване, да обяснят какво правят оператори като 2>&1 или &> и да сигнализират за грешки, преди да ги изпълните. Инструментите за машинно обучение също сканират пренасочените лог файлове и файлове с грешки, за да откроят аномалии, които ръчният преглед би пропуснал.

Да. Копилот на GitHub може да генерира команди и скриптове, които пренасочват входни, изходни и грешки от кратък коментар, описващ целта, и да ги изпълнява, докато пишете. Revпрегледайте всички предложени команди за вашите файлове, особено тези, използващи >, които презаписват съществуващи данни.

Обобщете тази публикация с: