Як сказати, який параметр подається в команду з оператором перенаправлення?


9

Це працює:

$ echo "сповістити-надіслати HELLO" | в даний час

Це не так:

$ зараз <echo "сповістити-надіслати HELLO"

У ньому написано "файл або каталог не знайдено".

Я розумію, що -fдля цієї команди є варіант, за допомогою якого я можу надати файл, який потрібно виконати в даний момент.

Отже, це задумало мене ... взагалі, як я можу знати, для якого параметра оператори перенаправлення надають значення?


5
Ваше запитання не дуже зрозуміле. Що ви маєте на увазі під "яким параметром". Можливо, ваше питання полягає в тому, що ви (помилково) вважаєте це foo | barі bar < fooрівнозначним. Вони не.
тердон

Відповіді:


16

Ви використовуєте тут дві різні речі, і ви повинні використовувати третю. Подивимось:

  1. |: Це оператор труби , він служить для передачі виходу одного процесу як вхід до іншого:

    foo | bar

    Це запускає програму fooі передає її вихід у вигляді входу до програми bar.

  2. >, <, >>І <<: Це ті оператори перенаправлення , вони служать для передачі даних в / з файлів :

    • foo > bar: запускає програму fooі зберігає її вихід у файл bar , перезаписуючи 1 його вміст і створюючи його, якщо його не існує.

    • foo >> bar: запускає програму fooі зберігає її вихід у файл bar , додаючи його вміст і створюючи його, якщо його не існує.

    • foo < bar: запускається foo, кажучи йому зчитувати вхід з файлу bar .

    • Це <<особливий випадок, оскільки немає сенсу "додавати" введення до команди, в <<основному тут використовується (виключно AFAIK) для документів Here :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      Конструкція << SomeStringHere > Out.fileбуде перенаправляти весь текст, написаний, поки він не зустріне кінцевий рядок ( EOFу прикладі вище) до цільового файлу. Тут документи дозволяють легко форматувати багаторядкові рядки та включати змінні та спеціальні символи.

  3. <<<Оператор, то тут рядок , це як тут документ , але вона розширюється змінні. Так, наприклад:

    grep foo <<< "$bar"

    Наведена вище команда еквівалентна echo "$bar" | grep foo.

  4. Те, що ви насправді шукаєте, називається заміщенням процесу і є іншим способом передачі виводу команди іншому. Він складається з <(command).

    foo <(bar) 

    Отже, для вашого atприкладу ви могли б зробити

    at now < <(echo "notify-send HELLO")

    Вищевказані роботи , тому що підміна процесу фактично створює файл (читайте за посиланням вище , для отримання більш докладної інформації) , і це дескриптор файлу з цього файлу , який передається з <до at now.


1 Поведінка за замовчуванням - це перезапис, це можна змінити, встановивши noclobberпараметр bash. Якщо встановлено, echo foo > barне буде, якщо barіснує. У такому випадку його можна примусово використовувати echo foo |> barзамість цього. Див. Розділ 3.6.2 тут .


1
Гарна відповідь! дуже ретельно (особливо, включаючи відмінності між файловими перенаправляючими)
steeldriver

@steeldriver aww, shucks, спасибі :) І так це було під ціною дорогоцінного каміння. Я хотів би, щоб я міг дати вам +1 за кожну з різних підводних каменів, яких ваше рішення мовчки уникає.
тердон

Чи можете ви також розширити, щоб включити деяку інформацію про <<та <<<(про яку @steeldriver згадував у своїй відповіді). Більше того, чи є більше - щось подібне >>>>>>чи <<<<<<<<<<?
Адітя

@Aditya зроблено. І не хвилюйтесь, зупиняється на <<<:)
Тердон

12

У цьому випадку echo "notify-send HELLO"це процес не файл - тому вам потрібна підміна процесу, а не перенаправлення файлу

at now < <(echo "notify-send HELLO")

Ви також могли використовувати рядок тут, щоб echoповністю уникнути команди

at now <<< "notify-send HELLO"

5
Побачивши такі питання, які вам подобаються (ті ж, що я роблю), я думаю, вам варто витратити ще трохи часу на Unix та Linux . Ми живемо і вмираємо для прикольних трюкових оболонок там ..
Тердон

@terdon: те саме, що для гольфістів Perl?
Sylvain Pineau

1
@SylvainPineau oooh так. Дуже так :). Серйозно, подібне питання, яке вам, насолоджувальникові та мені подобається, набагато частіше зустрічається там. Місце повне командних вундеркіндів, деякі з яких абсурдно знають.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.