Что делает следующую кошку commnad в среднем Unix? Я плохо знаком с Unix
cat test.txt | java myfilegrammar.pcfg > test1.txt 2> test2.txt
Это передает содержание по каналу 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 файлы.)
Randal L. Schwartz наградил бы Ваш код Бесполезным использованием cat
премия. Для получения дополнительной информации того, как каждый зарабатывает эту премию, и как ее можно избежать, см. http://sial.org/howto/shell/useless-cat/. Я просто заключу образец письма Randal L. Schwartz в кавычки для потомства.
И конечно, если Вы следовали вперед в течение недели или два, Вы знаете что это (Bing!) Бесполезное Использование CAT!
Rememeber, почти все случаи, где Вы имеете:
cat file | some_command and its args ...
можно переписать его как:
<file some_command and its args ...
и в некоторых случаях, такие как этот, можно переместить имя файла в arglist как в:
some_command and its args ... file
Просто другое Бесполезное Использование Usenet,
(Нет, я не попытка быть оскорбительным; просто интересный. Если Вы перейдете по ссылкам, то на Ваш вопрос ответят.)
Ваш 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