Как делают'>' и'>>' работа?

Я пытался rev файл и затем передает его по каналу к cat > same_file но это превращалось в пустой файл.

В то время как я попробовал rev file.txt | cat > file2.txt && mv file.txt file2.txt; это работало.

Даже rev file.txt | cat >> file.txt; обработанный.

Но когда я попробовал rev file.txt | cat > file.txt это перестало работать.

9
задан 23 August 2017 в 01:11

4 ответа

Основная вещь, которую необходимо схватить в этом случае между обоими способами перенаправить (> и>>):

>

Перенаправления и перезаписи информация, где на это указали. Это происходит при получении любой информации через канал "|"

>>

Перенаправления и конкатенируют к информации, на нее указали. Это происходит при получении любой информации через канал "|"

В обоих случаях, если файл не будет существовать, то он будет создан вместо этого. Только на">>" будет информация быть связанным, если Вы выполните ее снова на том же файле. С">" Вы просто перезаписали бы все, что Вы сделали на первом показе.

Но вот соглашение при использовании того же входного файла в качестве выходного файла. В том особом случае, если бы Вы используете">", Вы удалили бы информацию, которую должна проанализировать "входная" часть, так как выходной файл "перезаписал бы его". Таким образом в:

rev file.txt | cat > file.txt

То, что на самом деле происходит в "объяснении замедленного воспроизведения":

  1. rev готовится инвертировать содержание file.txt и отправьте его для передачи по каналу
  2. В то время как rev отправляет информация, чтобы передать по каналу, передать по каналу передает его потоком непосредственно к cat.
  3. В то время как cat получает информацию, она автоматически применит его к file.txt это было установлено с.
  4. Ключевое слово здесь - "то, в то время как", потому что все происходит одновременно. См. превосходные комментарии ниже Emil, чтобы иметь более глубокое понимание этой части.
  5. cat не будет ожидать rev передавать целый файл по каналу. Это просто запустит минуту, которую первая часть информации получает к нему, что означает, в зависимости от какого символа Вы использовали, он откроет соединение с file.txt.
  6. В этом случае, так как Вы использовали> вместо>>, оболочка усечет выходной файл, что означает, что это откроет и очистит информацию file.txt при ожидании новой информации для получения до него. С>> это открыло бы соединение с file.txt и ожидайте новой информации о последней обнаруженной строке.
  7. Так как информация была уже очищена в file.txt с>, rev попытался бы сделать, это - работа, и ничего не получите потому что cat удаленный все при подготовке к новой информации.

Итак, почему другие работают после того, чтобы читать вышеупомянутое. Из-за этого:

rev file.txt | cat > file2.txt && mv file.txt file2.txt

Вот, пожалуйста передавая по каналу кошке, которая отправляет информацию в другой файл. В этом случае, обработанный входной файл file.txt не то же как выходной файл file2.txt. После этого Вы буквально перезаписываете целое file2.txt с file.txt, так весь процесс, сделанный cat был удален. В основном целая строка могла быть упрощена как cp file.txt file2.txt потому что это делает то же самое с тех пор file2.txt в конце освобождает rev и перезаписывается с mv команда.

rev file.txt | cat >> file.txt

В этом случае Вы связываете информацию в тот же файл. Таким образом, это только открывает соединение с тем файлом, но не стирает информацию, как замечено с синглом>. Конечный результат должен быть, исходная информация плюс обратная информация.

18
ответ дан 23 November 2019 в 04:46

Когда оболочка видит перенаправление, она открывает соответствующие файлы сначала, прежде, чем выполнить любую из включенных команд. Таким образом, когда Вы делаете:

foo file.txt | bar > file.txt

перенаправление к file.txt причины это, чтобы быть усеченное прежде foo выполняется и может читать file.txt. На ноте стороны это - то, почему Вы не можете сделать:

sed 'blah' file.txt > file.txt

И почему sed имеет оперативную опцию редактирования.

Наконец, делая:

.. | cat > file.txt

бесполезное использование кошки , особенно поэтому, при попытке читать от file.txt раньше.

, Если Вы хотите инвертировать оперативный файл, , нет никаких ярлыков . Вы могли бы быть в состоянии использовать sed или awk приемы с оперативным редактированием.

9
ответ дан 23 November 2019 в 04:46

Можно использовать Vim в режиме Ex:

ex -sc '%!rev' -cx file.txt
  1. % выбор все строки

  2. ! команда выполнения

  3. x сохраняет и закрывается

0
ответ дан 23 November 2019 в 04:46

> редиректор (оператор), отправляющий вывод во что-то еще
(вход следующей команды, принтера..)

В Вашем случае вывод переходит к файлу file.txt, если этот файл уже существует, он перезаписывается, если не он создается.

>> добавлять оператор, если file.txt уже существуйте, вывод добавляется в конец файла. если файл не существует, он создается, и вывод, записанный в новый файл, то же как > (редиректор).

3
ответ дан 23 November 2019 в 04:46

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

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