отзовитесь эхом “привет”> &0 |>, file.txt не пишет в file.txt

Я узнаю об основных терминальных командах.

Почему эта команда не работает, поскольку я ожидаю это к?

echo "hello" >&0 | > file.txt

Я знаю, что могу просто ввести echo "hello" > file.txt но я узнаю об использовании каналов. Я просто хочу произвести слово "привет" в файл.

5
задан 28 March 2018 в 16:19

4 ответа

В 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 и использовать его в качестве значения подстановки команды.

16
ответ дан 23 November 2019 в 08:38

Полагаю, вы хотите записать вывод в файл и на стандартный вывод.

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 тоже.

5
ответ дан 23 November 2019 в 08:38

А-ч я вижу то, что Вы думали (я думаю). Вы попробовали

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.

12
ответ дан 23 November 2019 в 08:38
  • > символ - чтобы перенаправление файла запустилось файла.
  • >> символ для перенаправления файла в конец файла (добавляют).
  • | символ для "передачи по каналу" или передачи вывода от одной команды, как введено к другой команде.

    $ 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
0
ответ дан 23 November 2019 в 08:38

Другие вопросы по тегам:

Похожие вопросы: