Что означает следование котам в Unix? Я новичок в Unix
cat test.txt | java myfilegrammar.pcfg > test1.txt 2> test2.txt
Что означает следование котам в Unix? Я новичок в Unix
cat test.txt | java myfilegrammar.pcfg > test1.txt 2> test2.txt
Рэндал Л. Шварц присудит вашему коду награду « Бесполезное использование 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,
(Нет, я не пытаюсь быть оскорбительным; просто интересным. Если вы перейдете по ссылкам, на ваш вопрос будет дан ответ.)
Он передает содержимое 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.)
Ваша java
программа читает входные данные из stdin
а входные данные, которые вы хотите указать, находятся в файле test.txt
. Способ подачи этих входов, чтобы поместить содержимое файла text.txt
на stdout
и pipe
в потоке stdin
программы java
То же самое можно сделать без использования cat
как:
java myfile.java grammar.pcfg > test1.txt 2> test2.txt < test.txt
Каждый процесс в Linux начинается с трех файловых дескрипторов по умолчанию:
Если вы видите перенаправление, то есть 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 обрабатывает стандартный ввод.
отправьте содержимое test.txt в «myfile.java grammar.pcfg» через стандартный ввод. отправьте стандартный вывод myfile.java grammar.pcfg в test1.txt отправьте стандартный вывод ошибки myfile.java grammar.pcfg в test2.txt
это так же, как
java myfile.java grammar.pcfg > test1.txt 2> test2.txt < test.txt
но с дополнительным процессом (cat
), который читает данные из test.txt и печатает их на стандартный вывод (который перенаправляется по каналу |
на стандартный ввод java
)