Как программа узнает, что читать в конвейере? [дубликат]

Использование make install в коллекции портов регистрирует пакет в системе пакетов FreeBSD (путем создания временного манифеста пакета из порта и выполняется регистр пакетов ). Отсюда команда pkg знает, что установлено и как это удалить.

простая команда make install установит приложение и зарегистрирует его в системе пакетов.

О портах FreeBSD

В руководстве FreeBSD также указано, что вы можете использовать pkg для удаления установленных портов.

Установленные порты можно удалить с помощью pkg delete.

Использование коллекции портов

1
23.09.2018, 14:54
3 ответа

Вы написали две команды:cat someFileи foo. Первая команда должна прочитать someFileи записать его в standard output, который перенаправляется на pipe. Следующая команда считывает данные из своего standard input, на которые перенаправляется на вывод из pipe.

Стандартный ввод, стандартный вывод и стандартный вывод ошибок — основные термины Linux, а перенаправление и конвейер — самый мощный принцип для передачи данных между программами. Пожалуйста, поищите эти термины, чтобы понять основы командной строки Linux.

-1
27.01.2020, 23:31

В cat someFile | fooесть три элемента:

  1. cat someFile
  2. труба|
  3. foo

А теперь что происходит:

  1. catзнает, что оно должно читаться как someFile, потому что оно так называлось, и продавец сообщает ему подробности. А именно someFileздесь является параметром, и все параметры передаются вызываемому приложению.

  2. Канал — это то, что заставляет шелл разветвлять подоболочки и запускать в них процессы, а также упорядочивать подоболочки и процессы, устанавливая среди прочего их вход и выход. Вот как fooполучает ввод от cat.

  3. fooназывается так же, как и cat. Но после второго шага (, который фактически является шагом 1 в оболочке ), ввод в fooпоступает из cat. Так назывался трубопровод.

1
27.01.2020, 23:31

foo не знает, какой файл читать, он (предположительно )просто читает из своего стандартного потока ввода. Этот поток данных подключается оболочкой к стандартному выходному потоку команды cat. Эта "административная сантехника" выполняется оболочкой, поскольку она запускает два процесса (, которые они будут выполнять одновременно ).

В примере в вопросе именно catоткроет файл для чтения, прочитает его и передаст данные на свой стандартный вывод.

С таким же успехом можно спросить: «Откуда catзнает, куда записать результат?» Ответ заключается в том, что он пишет в свой стандартный поток вывода, подключенный оболочкой к стандартному потоку ввода команды foo. Аналогично, стандартный поток вывода команды fooподключается к терминалу оболочкой, поскольку для этой команды нет дополнительных каналов или перенаправлений.


Конвейер, который вы показываете,

cat someFile | foo

функционально идентичен

foo <somefile

Здесь я удалил cat, так как он на самом деле не нужен. Оболочка подключит стандартный поток ввода fooк заданному файлу, поэтому эффект будет таким же, как(fooсможет прочитать содержимое somefileиз своего стандартного потока ввода ).

В этой последней команде fooвсе еще не известно, что она считывает данные, поступающие из файла с именем somefile. Он также не знает, что больше не читает вывод cat. Он просто читает свой стандартный входной поток, как и раньше.

Теперь оболочка открывает файл somefileдля чтения, но оболочка не будет ничего читать из файла, а просто подключит стандартный поток ввода к открытому файлу, из которого fooбудет читаться.


Обратите внимание, что мы не знаем, что делает команда foo, делает ли она на самом деле что-нибудь со своим стандартным входным потоком или ожидает ли она чтения имени файла в своей командной строке.Такого рода информация будет доступна в руководстве по программе foo.

В случае, когда fooна самом деле нужно, чтобы было сказано читать из определенного файла, задав ему имя пути в командной строке, вы можете использовать

foo somefile

Теперь fooбудет отвечать как за открытие, так и за чтение из файла.

Если файл должен быть каким-то образом обработан (, предполагая, что "cat" является более сложным процессом, который фактически изменяет данные, считанные изsomefile):

cat somefile >newfile
foo newfile
rm newfile

То есть обработать файл и сохранить результат в новом временном файле, затем передать имя временного файла в foo. Затем удалите временный файл.

Или с оболочкой, которая понимает подстановки процессов (, напримерbash):

foo <( cat somefile )

Здесь оболочка устроит запись вывода cat somefileво временный файл (или именованный канал, на самом деле это не имеет значения ), и путь к этим данным будет вставлен на место процесса замены <(... ). Затем fooоткроет его как свой файл для чтения.

В этом последнем примере catоткрывает исходный файл и читает из него, а fooоткрывает любой путь, указанный оболочкой (где находится вывод cat)и читается из Это.

2
27.01.2020, 23:31

Теги

Похожие вопросы