Як я міг запам'ятати, як використовувати перенаправлення?


40

Я знаю що

  program > /dev/null 2>&1 

робить. Він перенаправляє висновок на /dev/nullі 2>&1означає перенаправляти вихід помилки там же, куди надсилається вихід.

Моя проблема полягає в тому, що я завжди мушу його гуляти, тому що я його ніколи не пам'ятаю.

Отже, я намагаюся &2>1, 1>2&, 1>&2... Я намагаюся кожну комбінацію , поки я не Google це ...

Яка хитрість легко запам'ятати його?


У мене те саме питання, тому я роблю це "довгим шляхом" - переадресовувати обидва program 1> /dev/null 2>/dev/null. Деколи, хоча вам потрібно змішати stdoutі stderrразом, щоб побачити, що насправді відбувається - як-от вихід зі складного процесу компіляції, який переспрямовується у файл. У такому випадку я закінчую
гуглінг

Відповіді:


20

Вихід кращий, ніж помилка, тому він стає першим (1 проти 2).

>є скороченням для "іде до". Зліва - те, що я хочу надіслати, а праворуч - це те, куди я хочу його надіслати. Оскільки "де" - це (майже) завжди файл, щось подібне

program > /dev/null 2>1

буде перенаправляти на файл з ім'ям 1. Таким чином, ampersand (&)змінює файл на дескриптор файлу.

На жаль, я не натрапив і не розробив власну мнемоніку, але коли я вперше вчився * nix, я знайшов цей логічний спосіб добре працювати. Після декількох пробігів це стає другою природою.


Ваше перше речення для мене не має сенсу. stdout- це дескриптор файлу 1, stderrє 2. Отже, "помилка" виникає перед "висновком".
Воррен Янг

Це речення мнемонічне, щоб запам'ятати дескриптор файлу stdoutта stderrпосилання.
gvkv

Гаразд, але це все ще здається заплутаним, оскільки оригінальне запитання стосується спроби запам'ятати порядок символів у заклику "2> & 1".
Воррен Янг

9

Один фокус - просто пам’ятати, що 1 = стандартний вихід, 2 = стандартна помилка. Тому:

2>&1= стандартний потік помилок переходить у стандартний вихідний потік.
1>&2= навпаки.

Якщо ви коли-небудь програмували мовою, подібною до С, легко запам'ятати ampersand ( &). Я вирішу вважати це посиланням на "адресу" існуючого дескриптора файлу, щоб ви не змінювали сам файл або не створювали новий.


7

Бачити &як вузол може допомогти: подумайте, що ви хочете зробити, як взяти вихід 2, так 2>, і зв’язавши його разом з 1, так2>&1


2
Я щойно запам’ятала фразу «два і один». Незалежно від того, чи є ваша мнемічна фраза чи вузол, наявність справді допоможе.
Тім Кеннеді

5

Насправді це залежить від того, яку оболонку ви використовуєте. Bash, як правило, дуже прощає, і ви можете просто зробити:

program &> file

5

Розглянемо ці три варіанти:

program  2>1
program  2>1& 
program  2>&1

Перший надсилає stderr до імен файлів "1": зрештою, bash розраховує перенаправити на файл.

Другий також переспрямовує на той самий файл, але працює programу фоновому режимі: саме так &має означати трейлінг .

Це залишає третю можливість як єдину, яка має сенс у Всесвіті bash для переадресації до файлової ручки.

Як запам'ятати, що є серед 0, 1, 2? Подумайте про запуск комп'ютера з консолі. Спочатку потрібно щось набрати (0 = stdin). Потім ви бачите вихід (1 = stdout). Нарешті, і лише якщо щось піде не так, ви бачите stderr (2).


1

Намалюйте його на шпалерах.

Тепер, серйозно, цей та інші основні речі я забував, тому я додав меню швидких порад у додаток, який я розробив і яким користуюся щодня. Ви можете спробувати або скористатися чимось на зразок гноти, щоб зберегти нотатку.


1

Що стосується панцирної оболонки, я вважаю, що найкращий спосіб запам'ятати це розуміння того, що відбувається.
Якщо все, що ви хочете зробити, це пам'ятати, як правильно виправити команду, ви можете спробувати

program > /results 2> /results

Це приємно і очевидно, що відбувається, і легко запам'ятовується. тобто

  • 1 STDOUT збирається /results
  • 2STDERR також збирається безпосередньо в/results

проблема полягає в тому, що це не працює так, як ви очікували. врахуйте наступне:

файл: /tmp/poem.txt

the quick brown fox jumped over the lazy dog

і запустіть команду

grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results

тоді

$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
 lazy dog

що тут сталося?
Моє розуміння - це bash налаштування перенаправлення, що вказує STDERR безпосередньо на файл /tmp/resultsі через природу >якого робить 2 речі

  1. як правило, створити новий файл - у цьому випадку можливість минула, коли bash пройшов повз цю процедуру під час отримання результату.
  2. вставити прямо на початок файлу. і не додавати, як >>це робиться.

Тож у цьому випадку STDERR вставляє безпосередньо на початок /tmp/resultsпереопределення виводу STDOUT.
Примітка: якщо ви >>додавали додавання, ви, ймовірно, могли піти з цього синтаксису.
Однак для усунення необхідної проблеми - не перенаправляти STDERR - у файл безпосередньо, а скоріше об'єднати висновок STDERR у потік STDOUT, щоб у вас не виникло зіткнення.
Використання оператора 2>&1оператора цього досягає

grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1

&Дозволяє Баш відрізнити від файлу з ім'ям 1і 1дескриптор файлу.
Для мене саме твердження 2>&1пояснює, що саме відбувається - STDERR переспрямовується на STDOUT сам - і закінчується лише /tmp/resultsтому, що саме там вказано STDOUT (майже як побічний ефект).
На відміну від того, що претендує багато довідників, а саме те, що 2>&1посилає STDERR туди, де колись вказано STDOUT. Якби це було правдою - у вас все одно виникне проблема перезапису.

Для отримання додаткової інформації дивіться - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection

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