Чтобы получить вывод команды, вам нужно как-то его прочитать. type
записывает это на стандартный вывод. И нам нужно как-то получить это и передать команде [
.
$(...)
использует для этого трубу. Но для канала вам нужен процесс записи и чтения, поэтому вам придется разветвить процесс даже для запуска встроенной команды. Вы можете попробовать чтение и запись в канал в одном и том же процессе, но это обычно склонно к взаимоблокировкам, поскольку запись может блокироваться, если никто не читает (, хотя вам нужно, чтобы буфер канала был заполнен, чтобы это произошло, что маловероятно для type
). ].
Вы можете сделать это с помощью оболочки yash
, которая имеет необработанный интерфейс кpipe()
:
{
type echo >&3
echo 3>&- # close the writing end so the reader can see an eof
IFS= read -r answer <&4
} 3>>|4
Выше вы получите взаимоблокировку, если вывод type
будет больше, чем размер буфера конвейера (64 КБ по умолчанию в современных версиях Linux ).
С помощью bash
вы всегда можете:
type -t echo > file
IFS= read -rd '' type < file
if [ "$type" = builtin ]...
Но хотя это позволяет избежать подоболочки, это означает засорение файловой системы этим file
.
Здесь type
— встроенная функция. Его вывод генерируется оболочкой, и это правда, что кажется немного глупым необходимость разветвлять процесс, чтобы иметь возможность использовать этот вывод в оболочке.
Некоторые оболочки(ksh93
иfish
)реализуют здесь некоторые оптимизации. В своих$(type echo)
((type echo)
вfish
)они фактически имитируют запись вывода и его чтение (. FreeBSD sh
также делает это для одиночных встроенных вызовов (, например type
здесь )). Когда встроенный стандартный вывод является подстановкой команды, вместо записи выводаоболочка просто добавляет выходной текст -будет -к результату подстановки команды, и нет необходимости в форке.
На самом деле fish
(type echo)
больше похож на ksh93
${ type echo;}
тем, что даже не создает подоболочку. С помощью $(...)
ksh93
эмулирует среду подоболочки, так что создается впечатление, что дочерний процесс был разветвлен для интерпретации кода в ней, и не делает этого для своего варианта ${...;}
.
ksh93$ a=1
ksh93$ echo "$(a=2; type echo) $a"
echo is a shell builtin 1
ksh93$ echo "${ a=3; type echo;} $a"
echo is a shell builtin 3
fish> set a 1
fish> echo (set a 2; type echo) $a
echo is a builtin 2
Вы обнаружите, что в некоторых оболочках, не использующих эту оптимизацию, многие встроенные функции могут вызываться таким образом, что вместо записи результата они сохраняют его в переменной.
Наиболее очевидными из них являются стандартные read
и getopts
, которые по умолчанию делают (вы делаете IFS= read -r var
вместоvar=$(line)
). bash
и zsh
также имеют printf -v variable format args
. zsh
может сделать то же самое для своих stat
, strftime
... встроенных функций.
Некоторые оболочки также делают некоторую информацию уже доступной автоматически в некоторых специальных переменных, таких как ksh
$SECONDS
и $RANDOM
, найденных в нескольких других оболочках (и стандартных, таких как $-
,$#
(эквивалентно fish
(count $argv)
, например )).
В zsh
это обобщено для большей части внутренней информации оболочки, поэтому вам почти никогда не нужно использовать подстановку команд в выводе встроенной команды. Например, у него есть ассоциативные массивы для списка встроенных функций, ключевых слов, команд...
if (($+builtins[echo])); then
echo echo is a builtin
fi
dvb-fe-tool
— это инструмент для мониторинга и управления передним -концом устройства DVB, например. выбор режима DVB -T/DVB -T2/DVB -C, если применимо, и проверка параметров модуляции низкого -уровня.
Аппаратное декодирование MPEG4 выполняется позже, вне внешнего -конечного компонента, после демультиплексирования транспортного потока DVB (TS )для выбора конкретного программного потока (PS )и видеопотока. (видео PES )внутри него. Как только демультиплексор выбрал нужный видеопоток MPEG4 из транспортного потока, его можно передать аппаратному декодеру, если он доступен.
Вам следует проверить, существуют ли какие-либо /dev/dvb/adapter*/video*
устройства. -Если нет, то ваш DVB-адаптер вообще не имеет возможностей аппаратного декодирования MPEG. На обычных ПК функции аппаратного декодирования MPEG4 чаще всего можно найти в графическом процессоре.поэтому наличие их в тюнере DVB обычно было бы бесполезным дублированием функций.
Кроме того, передача более компактного потока данных MPEG4 на графический процессор для отображения требует гораздо меньшей пропускной способности системной шины, чем передача полностью декодированных растровых изображений.