Что означает следование котам в Unix? Я новичок в Unix

cat test.txt | java myfilegrammar.pcfg > test1.txt 2> test2.txt

7 ответов7

4

Рэндал Л. Шварц присудит вашему коду награду « Бесполезное использование cat ». Для получения дополнительной информации о том, как получить эту награду и как ее избежать, см. Http://sial.org/howto/shell/useless-cat/. Я просто процитирую бланк письма Рэндала Л. Шварца для потомков.

И, конечно же, если вы следили за ним в течение недели или двух, вы знаете, что это (BING!) это бесполезное использование кошки!

Помните, почти все случаи, когда у вас есть:

    cat file | some_command and its args ...

Вы можете переписать его как:

    <file some_command and its args ...

и в некоторых случаях, таких как этот, вы можете переместить имя файла в список аргументов, как показано в:

    some_command and its args ... file

Просто еще одно бесполезное использование Usenet,

(Нет, я не пытаюсь быть оскорбительным; просто интересным. Если вы перейдете по ссылкам, на ваш вопрос будет дан ответ.)

3

Он передает содержимое test.txt на вход файла java myfile.java grammar.pcfg , а затем перенаправляет поток вывода этой команды java на test1.txt а поток ошибок на test2.txt .

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

(cat test.txt | java myfile.java grammar.pcfg) > test1.txt 2> test2.txt

Это делает более понятным, что первый текстовый файл является входным файлом, а последние два являются выходными файлами.

(Тем не менее, бит java myfile.java не имеет для меня никакого смысла - java вызывается для файлов .class, а не для файлов .java.)

1
  1. Дамп содержимого test.txt в стандартный ввод для процесса, запущенного с использованием java в качестве исполняемого файла с аргументами «myfile.java grammar.pcfg»
  2. Сопоставить стандартный вывод выполнения java с test1.txt
  3. Сопоставьте поток ошибок с test2.txt
1

Ваша java программа читает входные данные из stdin а входные данные, которые вы хотите указать, находятся в файле test.txt . Способ подачи этих входов, чтобы поместить содержимое файла text.txt на stdout и pipe в потоке stdin программы java

То же самое можно сделать без использования cat как:

java myfile.java grammar.pcfg > test1.txt 2> test2.txt < test.txt 
1

Каждый процесс в Linux начинается с трех файловых дескрипторов по умолчанию:

  • 0 -> Стандартный ввод
  • 1 -> Стандартный вывод
  • 2 -> Стандартная ошибка

Если вы видите перенаправление, то есть fd_number > some_file.txt , это указывает на то, что все, что обычно печатается в файл, содержащий дескриптор файла, fd_number теперь будет перенаправлено на то, что будет после него.

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

cat test.txt | java myfile.java grammar.pcfg 1> test1.txt 2> test2.txt

Или же:

java myfile.java grammar.pcfg 0< test.txt 1> test1.txt 2> test2.txt

... в зависимости от того, как myfile.java обрабатывает стандартный ввод.

0

отправьте содержимое test.txt в «myfile.java grammar.pcfg» через стандартный ввод. отправьте стандартный вывод myfile.java grammar.pcfg в test1.txt отправьте стандартный вывод ошибки myfile.java grammar.pcfg в test2.txt

0

это так же, как

java myfile.java grammar.pcfg > test1.txt 2> test2.txt < test.txt

но с дополнительным процессом (cat), который читает данные из test.txt и печатает их на стандартный вывод (который перенаправляется по каналу | на стандартный ввод java)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .