Использование make install
в коллекции портов регистрирует пакет в системе пакетов FreeBSD (путем создания временного манифеста пакета из порта и выполняется регистр пакетов
). Отсюда команда pkg
знает, что установлено и как это удалить.
простая команда make install установит приложение и зарегистрирует его в системе пакетов.
В руководстве FreeBSD также указано, что вы можете использовать pkg для удаления установленных портов.
Установленные порты можно удалить с помощью pkg delete.
Вы написали две команды:cat someFile
и foo
. Первая команда должна прочитать someFile
и записать его в standard output
, который перенаправляется на pipe
. Следующая команда считывает данные из своего standard input
, на которые перенаправляется на вывод из pipe
.
Стандартный ввод, стандартный вывод и стандартный вывод ошибок — основные термины Linux, а перенаправление и конвейер — самый мощный принцип для передачи данных между программами. Пожалуйста, поищите эти термины, чтобы понять основы командной строки Linux.
В cat someFile | foo
есть три элемента:
cat someFile
|
foo
А теперь что происходит:
cat
знает, что оно должно читаться как someFile
, потому что оно так называлось, и продавец сообщает ему подробности. А именно someFile
здесь является параметром, и все параметры передаются вызываемому приложению.
Канал — это то, что заставляет шелл разветвлять подоболочки и запускать в них процессы, а также упорядочивать подоболочки и процессы, устанавливая среди прочего их вход и выход. Вот как foo
получает ввод от cat
.
foo
называется так же, как и cat
. Но после второго шага (, который фактически является шагом 1 в оболочке ), ввод в foo
поступает из cat
. Так назывался трубопровод.
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
)и читается из Это.