Як називається функція оболонки `> (tee copyError.txt> & 2)`?


11

Мені потрібно увімкнути stdout та stderr на логіни, але лише показувати повідомлення про помилки на екрані. Я можу це зробити за допомогою:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Якого я знайшов десь в Інтернеті.

Я просто хочу знати, як >(tee copyError.txt >&2)називається ця річ? Я не можу використовувати Google для цього, оскільки Google ігнорує такі символи, як кутові дужки та круглі дужки.


Перенаправлення файлів ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik

@terdon Я думаю, що ОП заявила, що він хотів записати StdOut та StdErr у файли, але також все ще показувати StdErr на екрані
Дмитро Автономов

Відповіді:


11

Від man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

Ви можете здійснювати пошук на сторінках керування, натискаючи /та потім набираючи рядок пошуку, що є хорошим способом пошуку подібної інформації. Звичайно, потрібно знати, в якій сторінці пошуку шукати :)

Ви повинні процитувати, (хоча це має особливе значення при пошуку. Щоб знайти відповідний розділ на баш-сторінці, введіть />\(.


Я дуже багато баш, тому я зробив man bash> bashman.txt і зробив це лише для читання. Тепер я можу завантажити bashman.txt в інше вікно свого текстового редактора (лише для читання) і використовувати всі можливості редактора для пошуку та копіювання та вставлення.
Джо

8

>(tee copyError.txt >&2) насправді є кілька різних особливостей:

  • >(...)називається «процес заміщення». Він створює іменований файл труби в /dev/fdі записування в цей файл надасть вхід до процесу в дужках.

  • >: Взагалі це називається "перенаправлення виводу" і дозволяє надіслати стандартний вихід ( >або 1>) або стандартну помилку ( 2>) у файл або процес. >&2є перенаправлення виведення , але в цьому випадку вихідний сигнал teeпосилається стандартної помилки (це те, що &2є, &1це стандартний висновок)

  • Без цього >дужки ( ()) запускають підзаголовок. Запуск команд у дужках породжує іншу оболонку, яка існуватиме лише до тих пір, поки ці команди виконуються. Ви можете бачити, як це працює, якщо оголосити змінну в нижній частині:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom
    

    Як бачимо, те, $fooщо було визначено в підшалі, є окремим від визначеного в батьківській оболонці.


4
Ні >(...)- це не перенаправлення. >(...)розширюється до імені файлу. Якщо ви хочете перенаправити вихід на це, вам потрібно, > >(...)але >(...)він використовується, як правило, там, де перенаправлення неможливо використовувати. Командування ОП може бути досягнуто традиційними трубами, там немає необхідності в заміні технологічних процесів.
Стефан Шазелас

@StephaneChazelas Було б приємно бачити рішення, яке ви мали на увазі
Дмитро Автономов

3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas

@StephaneChazelas thx!
Дмитро Автономов

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