Это работает:
$ echo "уведомить-отправить HELLO" | сейчас
Это не:
$ сейчас <echo "уведомить-отправить HELLO"
Там написано «файл или каталог не найден».
Я понимаю, что есть -f
опция для этой команды, с помощью которой я могу предоставить файл для выполнения в данный момент.
Так что это заставило меня задуматься ... в общем, как мне узнать, для какого параметра операторы перенаправления предоставляют значение?
command-line
bash
влад-Ardelean
источник
источник
foo | bar
иbar < foo
эквивалентны. Они не.Ответы:
Вы используете две разные вещи здесь и должны использовать третью. Посмотрим:
|
Это оператор канала , он служит для передачи вывода одного процесса в качестве ввода другому:Это запускает программу
foo
и передает ее вывод в качестве ввода в программуbar
.>
,<
,>>
И<<
: Это те операторы перенаправления , они служат для передачи данных в / из файлов :foo > bar
: запускает программуfoo
и сохраняет ее вывод в файлbar
, перезаписывая 1 его содержимое и создавая его, если он не существует.foo >> bar
: запускает программуfoo
и сохраняет ее вывод в файлbar
, добавляя его содержимое и создавая его, если он не существует.foo < bar
: бежитfoo
, приказывая прочитать входные данные из файлаbar
.Это
<<
особый случай, поскольку нет смысла «добавлять» ввод в команду, в<<
основном (исключительно AFAIK) используется для Here Documents :Конструкция
<< SomeStringHere > Out.file
будет перенаправлять весь написанный текст, пока не встретит конечную строку (EOF
в примере выше) в целевой файл. Здесь документы позволяют легко форматировать многострочные строки и включать переменные и специальные символы.<<<
Оператор, то здесь строка , это как здесь документ , но она расширяется переменные. Так, например:Команда выше эквивалентна
echo "$bar" | grep foo
.То, что вы на самом деле ищете, называется подстановкой процесса и является еще одним способом передачи вывода команды другой. Он состоит из
<(command)
.Итак, для вашего
at
примера, вы могли бы сделатьВышесказанное работает, потому что процесс подстановки фактически создает файл (для получения более подробной информации прочитайте ссылку выше), и именно файловый дескриптор этого файла передается
<
вat now
.1 Поведение по умолчанию - перезапись, это можно изменить, установив
noclobber
опцию bash. Если установлено,echo foo > bar
потерпит неудачу, еслиbar
существует. В этом случае его можно принудительно использоватьecho foo |> bar
вместо. Смотрите раздел 3.6.2 здесь .источник
<<
и<<<
(который @steeldriver упомянул в своем ответе). Более того, есть еще что-то вроде>>>>>>
или<<<<<<<<<<
?<<<
:)В данном случае
echo "notify-send HELLO"
это процесс, а не файл, поэтому вам нужна замена процесса, а не перенаправление файла.Вы также могли бы использовать здесь строку, чтобы полностью избежать
echo
командыисточник