Различие между 2> &1> output.log и 2> &1 | кладет для первого удара output.log

Вот другое решение C, для которого только нужны STD C и меньше памяти:

#include <stdio.h>

int main(int argc, char **argv)
{
  if (argc < 2 || !*argv[1]) {
    puts("Argument missing.");
    return 1;
  }
  char c = *argv[1], x = 0;
  size_t count = 0;
  while ((x = getc(stdin)) != EOF)
    if (x == '\n') {
      printf("%zd\n", count);
      count = 0;
    } else if (x == c)
      ++count;
  return 0;
}
36
11.09.2011, 02:06
5 ответов

Редакционная статья

Удостоверьтесь, что прочитали комментарии к этому ответуderobert.


Исходный ответ

2>&1 >output.log средства сначала начинают отправлять, весь материал дескриптора файла 2 (стандартная погрешность) к дескриптору файла 1 (стандартный вывод) затем отправляют это в файл output.log. Другими словами, отправьте стандартную погрешность и стандартный вывод к файлу журнала.

2>&1 | tee output.log то же с 2>&1 бит, это комбинирует стандартный вывод и стандартную погрешность на потоке стандартного вывода. Это затем передает это по каналу через tee программа, которая отправит ее стандартный вход в ее стандартный вывод (как cat) и также в файл. Таким образом, это комбинирует эти два потока (ошибка и вывод), затем выводы это к терминалу и файлу.

Нижняя строка - то, что первое отправляет stderr/stdout в файл, в то время как второе отправляет его и в файл и в стандартный вывод (который является, вероятно, терминалом, если Вы не в другой конструкции, которая перенаправила стандартный вывод).

Я упоминаю, что последняя возможность, потому что у Вас может быть материал как:

(echo hello | tee xyzzy.txt) >plugh.txt

где ничто не заканчивается на терминале.

24
27.01.2020, 19:36
  • 1
    1 Вы имеете право синтаксиса, но не семантику. Выполненный cat /doesnotexist 2>&1 >output.txt - Вы будете видеть, посмотрите cat: /doesnotexist: No such file or directory отображенный к терминалу и output.txt пустой файл. Порядок очередности и закрытие находятся в игре: 2>&1 (копируйте fd2 от текущего fd1), затем >output.txt (перенаправьте fd1 к output.txt, не изменив ничто больше). Причина это 2>&1 | отличается, из-за порядка очередности: | прежде >. –  Arcege 11.09.2011, 02:33

Первая команда сделает другую задачу:

После

2>&1 > output.log 

старый STDOUT будет сохранен (скопированный) в STDERR, и затем STDOUT будет перенаправлен в файл.

Так, stdout перейдет к файлу, и stderr перейдет к консоли.

И в

 2>&1 | tee output.log

оба потока будут перенаправлены для кладения для первого удара. Мишень копирует любой вход к своему stdout (консоль в Вашем случае) и зарегистрировать (output.log).

И существует другая форма сначала:

    > output.log  2>&1

это перенаправит и STDOUT и STDERR в файл.

8
27.01.2020, 19:36

Бывшие выводы только в файл. Вторые выводы и в файл и на экран.

4
27.01.2020, 19:36

Причина 2>&1 | tee должен смочь получить и stdout и stderr к файлу журнала и видеть его на экране одновременно. Это могло быть сделано как >output.txt 2>&1 & tail -f также, но Вы не знали бы, когда фоновая завершенная команда - является завершенной программой или является ею работающий без вывода. 2>&1 | tee была общая идиома для программистов.

4
27.01.2020, 19:36

Вот пост суммировал выходные потоки Unix: http://www.devcodenote.com/2015/04/unix-outt-streams.html

фрагмент с поста:

Есть 3 Стандартные выходные потоки:

STDIN - Standard Input - Writes from an input device to the program
STDOUT - Standard Output - Writes program output to screen unless specified otherwise.
STDERR - Standard Error Output - Writes error messages. Also printed to the screen unless specified otherwise.
-1
27.01.2020, 19:36

Теги

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