Я узнаю об основных терминальных командах.
Почему эта команда не работает, поскольку я ожидаю это к?
echo "hello" >&0 | > file.txt
Я знаю, что могу просто ввести echo "hello" > file.txt
но я узнаю об использовании каналов. Я просто хочу произвести слово "привет" в файл.
В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt
является составной командой, состоящей из двух простых команд echo "hello" >&0
, > file.txt
, переданных по конвейеру. Вторая команда пуста, поэтому bash просто открывает файл для записи, усекает его, а затем закрывает.
В терминале обычно стандартный вход, выход и ошибка все связаны с терминалом. Поэтому, когда вы перенаправляете стандартный вывод на стандартный вывод, он все еще указывает на терминал, и вывод echo hello >&0
виден в терминале и вообще не отправляется в канал.
В zsh, пустая команда с перенаправлением по умолчанию имеет команду cat
. Таким образом, echo "hello" >&0 | > file.txt
эффективно echo "hello" >&0 | cat > file.txt
, и вы увидите желаемый эффект. Это невозможно в bash. Здесь вы увидите еще одну функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из этих перенаправленных адресатов (поэтому hello
отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.
* Исключением является подстановка команды перенаправленным stdin. В $(<some-file)
bash будет читать содержимое some-file
и использовать его в качестве значения подстановки команды.
Полагаю, вы хотите записать вывод в файл и на стандартный вывод.
echo hello > file.txt
делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee
, как показано ниже:
echo hello | tee file.txt
Он направляет выход echo
на вход tee
, а затем выполняет запись на экран и в тоже file.txt.
Если вы просто хотите напечатать в файл, используйте команду cat
, как показано ниже:
echo hello | cat >file.txt
Также проверьте этот ответ на предмет того, как работают перенаправления: https://stackoverflow.com/a/ 818265/5771279
и вот как работает труба: https://stackoverflow.com/a/9834118/5771279
Посмотрите на человека страница команды tee
тоже.
А-ч я вижу то, что Вы думали (я думаю). Вы попробовали
echo hello | > file
и ничего не произошло с file
, таким образом, Вы думали, возможно, я должен превратить вывод своей команды в stdin путем перенаправления:
echo hello >&0
Но превращение stdout в stdin точно, что делает канал. Это берет stdout и передает его команде с ее правой стороны от него как stdin. При перенаправлении stdout ничто не пройдет через канал:
$ echo hello >&0 | cat > file
hello
$ cat file
$
(ничто там)
Но hello
вышел в терминале, который читает из stdin, как обычно:
$ cat /dev/fd/0
hi
hi
I am talking to myself!
I am talking to myself!
и так далее...
Если мы не перенаправляем...
$ echo hello | cat > file
$ cat file
hello
stdout echo hello
прошел канал (вместо к терминалу) и стал stdin cat
.
Так, канал делает то, что Вы хотели сделать (превратите stdout в stdin и подключите его к правильной команде), и Вы не должны делать этого сами путем игры с дескрипторами файлов.
Что касается того, почему пустая команда с перенаправлением не делает то, что Вы хотите, см. ответ muru.
>
символ - чтобы перенаправление файла запустилось файла.>>
символ для перенаправления файла в конец файла (добавляют). |
символ для "передачи по каналу" или передачи вывода от одной команды, как введено к другой команде.
$ echo "Hello" > file.txt
$ echo "World!" >> file.txt
$ cat file.txt
Hello
World!
$ cat file.txt | grep !
World!
grep
(Глобальная печать регулярного выражения) команда ищет файл данную строку поиска и печатает строку, это идет.
&>0
согласно Руководству по созданию сценариев усовершенствованного Bash:
&>filename
# Redirect both stdout and stderr to file "filename."
# This operator is now functional, as of Bash 4, final release.
В Вашем случае имя файла было 0, который является стандартным входом. Таким образом, это перенаправляет весь вывод для ввода. Который настолько лучше всего, как я могу сказать, является циклической ссылкой, которая не будет работать. Синтаксис, который Вы использовали, >&0
который перенаправляет вывод для ввода. Который является, также, кажется, циклическая ссылка.
"Имена файлов":
0
стандартный вход1
стандартный вывод2
стандартная погрешность производитсяТрадиционный способ использовать дескриптор файла 0
(стандартный вход) через файл перенаправление:
0< FILENAME
< FILENAME
# Accept input from a file.
# Companion command to ">", and often used in combination with it.
#
# grep search-word <filename
Если Вы хотите использовать echo
команда и |
вместе (поскольку ответ Zanna указывает) можно использовать:
$ echo "hello" | cat > file.txt
$ cat file.txt
hello