Понимание того, как работает команда 'cat' - PullRequest
0 голосов
/ 08 декабря 2011

cat объединяет файлы или стандартный ввод и перенаправляет его на стандартный вывод.

$ cat file1 > file5 file2 file3 file4

объединяет файл1, файл2, файл3 и файл 4 и записывает его в файл 5.

$ cat file1 > file5 < file2 file3 file4

объединяет файл1, файл3 и файл4 (не файл2) и записывает в файл5

Пожалуйста, объясните эти выводы

Примеры того, что происходит:

~/test$ echo "this is file 1"> file1
~/test$ echo "this is file 2"> file2
~/test$ echo "this is file 3"> file3
~/test$ echo "this is file 4">file4
~/test$ cat file1 > file5 file2 file3 file4
~/test$ cat file5
this is file 1
this is file 2
this is file 3
this is file 4
~/test$ cat file1 > file5  < file2 file3 file4
~/test$ cat file5
this is file 1
this is file 3
this is file 4

Ответы [ 4 ]

2 голосов
/ 08 декабря 2011

Это меньше о том, как работает cat, и больше о перенаправлении оболочки. Оболочка обрабатывает командную строку до запуска программы. Это легче увидеть, если вы передвинете все перенаправления ввода / вывода в конец команды. Первое становится:

cat file1 file2 file3 file4 > file5

Затем оболочка изменяет вывод cat с терминала на файл5. Это полностью не зависит от кошки.

Вторая команда тогда

cat file1 file3 file4 >file5 <file2

Это меняет стандартный ввод с клавиатуры на file2, а вывод, как и прежде, на файл5. В этом случае, поскольку в командной строке указаны файлы, cat игнорирует стандартный ввод, считывая только с 1, 3 и 4. Аргумент - указывает cat читать со стандартного ввода, поэтому

cat file1 - file3 file4 >file5 < file2

Вывести содержимое файлов 1-4 в файл 5.

1 голос
/ 08 декабря 2011

Попробуйте создать простой файл bash

#!/bin/bash

echo $@

И запустить

./bash.sh file1 file2 file3 file4 > file5

даст вам

file1 file2 file3 file4

./bash.sh file1 file3 file4 >file5 <file2

даст вам

file1 file3 file4

в файле 5 вы видите список аргументов, то, что делает cat, принимает список аргументов и записывает его в вывод std, поэтому файл 2 игнорируется, это не параметр, а фактически вход

если вы хотите, чтобы cat читал из std input assign - после команды

cat file1 > file5 < file2 file3 file4 -

это будет записывать

1111
3333
4444
2222

в файл 5

<означает перенаправление ввода std, если вы пишете </p>

cat file1 > file5 file3 file4 -

, он читает из файла file1, file3 и file4 и вашей клавиатуры в файл5

1 голос
/ 08 декабря 2011

Перенаправления могут быть размещены в любом месте командной строки, хотя обычный путь находится в конце.

Ваше второе утверждение неверно.file2 должен быть проигнорирован. (был исправлен позже)

1 голос
/ 08 декабря 2011

В оболочке происходит только одно перенаправление; остальные передаются в качестве аргументов.

Первая команда:

cat file1 file2 file3 file4 > file5

Вторая команда

cat file1 file3 file4 > file5 < file2

Вторая команда не включает file2, потому что cat никогда не велено читать из стандартного ввода с -.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...