Перенаправление вывода в конвейере (Помогите проянисть один момент)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Razielin
Сообщения: 4
ОС: Linux

Перенаправление вывода в конвейере

Сообщение Razielin » 03.10.2014 22:07

Извиняюсь если вопрос совсем нубский, но давно интересует, а нигде толкового объянения не нашел.
К примеру, есть команда вида:

Код: Выделить всё

bunzip2 -c somefile.tar.bz2 | tar -xvf -

Собственно, меня интересует последний "минус".
Зачем в командах такого вида он нужен? Потому что tar не является фильтром?
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Перенаправление вывода в конвейере

Сообщение /dev/random » 03.10.2014 22:20

Razielin писал(а):
03.10.2014 22:07
Извиняюсь если вопрос совсем нубский, но давно интересует, а нигде толкового объянения не нашел.
К примеру, есть команда вида:

Код: Выделить всё

bunzip2 -c somefile.tar.bz2 | tar -xvf -

Собственно, меня интересует последний "минус".
Зачем в командах такого вида он нужен? Потому что tar не является фильтром?


Здесь "-" - это параметр, передаваемый опции -f. Эта опция ожидает имя файла, который нужно распаковывать. Многие команды (но далеко не все!), в том числе tar, принимают "-" в качестве имени файла, если нужно работать с stdin или stdout, а не с именованным файлом.

Между прочим, эта команда избыточна. Во-первых, если опцию -f не указать вообще, то "-f -" подразумевается по умолчанию. Т.е. можно записать так:

Код: Выделить всё

bunzip2 -c somefile.tar.bz2 | tar -xv

Во-вторых, tar может сам запустить bunzip2, если указать опцию -j:

Код: Выделить всё

tar -xjvf somefile.tar.bz2
или даже распознав формат по расширению, безо всякого -j:

Код: Выделить всё

tar -xvf somefile.tar.bz2
(опция -j обязательна, если у файла нестандартное расширение, или если архив передаётся на stdin)
Спасибо сказали:

Razielin
Сообщения: 4
ОС: Linux

Re: Перенаправление вывода в конвейере

Сообщение Razielin » 04.10.2014 16:58

/dev/random писал(а):
03.10.2014 22:20
Здесь "-" - это параметр, передаваемый опции -f. Эта опция ожидает имя файла, который нужно распаковывать. Многие команды (но далеко не все!), в том числе tar, принимают "-" в качестве имени файла, если нужно работать с stdin или stdout, а не с именованным файлом.

Я заметил, что некоторые программы автоматически считывают имена файлов из stdin а таких случаях, а некоторым нужно дополнительно указывать с помощью "-" или опции.
Я все еще немного не понимаю: разве программе не все равно как получен список файлов? Конвейер же передает результат на ее stdin. Какая разница, если мы передаем что-то на stdin по конвейеру или напишем сами в терминале?
Между прочим, эта команда избыточна.

Просто первая команда, которую нашел в Интернете, просто для примера.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Перенаправление вывода в конвейере

Сообщение /dev/random » 04.10.2014 17:15

Razielin писал(а):
04.10.2014 16:58
Я все еще немного не понимаю: разве программе не все равно как получен список файлов? Конвейер же передает результат на ее stdin. Какая разница, если мы передаем что-то на stdin по конвейеру или напишем сами в терминале?


На stdin передаётся не список файлов. stdin сам - файл. В отличие от обычных файлов, отдельный для каждого процесса. И команда должна знать, работать ли с ним или с каким-то другим файлом. А аргументы команды - это совершенно отдельная сущность. Обычно именно через них команда узнаёт, с чем работать и что именно делать.
Спасибо сказали:

Razielin
Сообщения: 4
ОС: Linux

Re: Перенаправление вывода в конвейере

Сообщение Razielin » 06.10.2014 23:17

/dev/random писал(а):
04.10.2014 17:15
На stdin передаётся не список файлов. stdin сам - файл. В отличие от обычных файлов, отдельный для каждого процесса. И команда должна знать, работать ли с ним или с каким-то другим файлом. А аргументы команды - это совершенно отдельная сущность. Обычно именно через них команда узнаёт, с чем работать и что именно делать.

Спасибо вам за помощь, вроде, более-менее ясно.
Спасибо сказали: