Встроенные функции оболочки доступны только оболочке, поэтому внешние команды не могут их запускать. например команда external time
может запускать только другие внешние команды. Внешние команды не могут запускать встроенные оболочки, псевдонимы оболочки или функции оболочки.
Обратите внимание, что оболочки сами по себе являются внешними командами (например, / bin / sh
, / bin / bash
и т. Д.), Поэтому внешние команды могут запускать оболочку с помощью -c
, например сравните sh -c 'time echo foo'
с sh -c '/ usr / bin / time echo foo'
или выполните сценарий оболочки, который использует встроенные функции.
Если есть внешние команды с тем же именем, что и встроенная оболочка (например, time
, echo
, kill
, ...) тогда внешние команды могут запускать их, но даже если они выполняют одну и ту же базовую задачу, они, вероятно, будут немного отличаться (например, разные параметры командной строки, другой формат вывода, разные возможности - встроенный kill
может убить с помощью номер задания оболочки, внешний kill
не может).
Встроенные команды оболочки (например, time
или команда
) могут выполнять как встроенные, так и внешние команды, а также псевдонимы оболочки и функции.
Команда file
должна рассказать вам о самом файле:
$ file test.zip
test.zip: Zip archive data, at least v1.0 to extract
$ file test.tar.gz
test.tar.gz: gzip compressed data, last modified: Sun May 26 11:28:34 2019, from Uniz
Но для файлов внутри архивов вам нужно извлечь их и запустить file
для каждого из них по отдельности.
С GNUtar
:
tar --to-command='exec file -b -' -xvvf file.tar.gz
Для файлов zip
вы можете конвертировать в tar
на лету с помощью bsdtar
и снова использовать GNU tar
для вызова file
для каждого члена:
bsdtar cf - @file.zip | tar --to-command='exec file -b -' -xvvf -
Выдает такой результат, как:
-rw-rw-r-- 0/0 7653 1999-12-30 10:26 WINOBJ.HLP
MS Windows 3.1 help, Thu Dec 30 15:26:17 1999, 7653 bytes
-rw-rw-r-- 0/0 7005 2006-07-28 08:32 Eula.txt
Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators
-rw-rw-r-- 0/0 729464 2011-02-14 11:37 Winobj.exe
PE32 executable (GUI) Intel 80386, for MS Windows
Команда file
угадывает тип файла, используя эвристику на основе первых нескольких байтов файла. Так что в любом случае данные нужно извлекать из файла. Даже для того, чтобы сообщить о выводе tar tvf
, tar
необходимо прочитать и распаковать весь архив, поскольку информация хранится перед содержимым каждого элемента архива, но ни одно из приведенных выше решений не извлекает элементы на диск ., данные передаются из bsdtar
в tar
и из tar
в file
по каналам, содержимое элементов архива даже не сохраняется целиком в памяти.
После того, как file
возвращается после прочтения первых нескольких байтов файла, GNU tar
разумно обрабатывает его и пропускает остальную часть элемента архива (вместо того, чтобы умирать от SIGPIPE )перед запуском следующего file
команда для следующего члена архива.
Неоптимальным с точки зрения эффективности является выполнение одной командыsh
(для интерпретации командной строки exec file -b -
)и одной команды file
для каждого члена обычного файлового архива. Мы используем exec
, чтобы один и тот же процесс повторно использовался для sh
иfile
(для тех sh
реализаций, таких как dash
, которые не выполняют эту оптимизацию сами по себе ).