Почему bash не назначает fd для var при использовании внешней _команды {var}>somefile?

То, что вы пишете и как вы это пишете, говорит о том, что в ваших знаниях может быть один или два пробела.

Знаете ли вы о РЕПОЗИТОРИЯХ и как ими пользоваться? Прошивка доступна из репозитория, НО вам нужно изменить список источников, чтобы получить ее.

Debian по умолчанию предоставляет только «бесплатные» продукты. Прошивка является проприетарной, т.е. «не бесплатной», но к ней все еще можно получить доступ.

См. https://linuxpanda.wordpress.com/2016/12/31/things-to-do-after-installing-debian-stretch/, особенно раздел «Обновление списка источников». НЕ СЛЕДУЙТЕ СЛЕПОЕ ЗА ОСТАЛЬНОЙ ЧАСТЬЮ ЭТОГО САЙТА, ​​ЕСЛИ/ПОКА ВЫ НЕ ПОНИМАЕТЕ, ЧТО МОЖЕТЕ ДОБАВЛЯТЬ.

См.https://wiki.debian.org/DebianRepository

Вам будет полезно добавить synaptic > (AS ROOT )apt install synaptic.

Прошивка в основном нужна для видео и вайфая. Как правило, люди работают на основе «Кажется, это работает?» и «Если это не сломано, не пытайся это починить».

Потребность во встроенном программном обеспечении обычно можно определить, сначала идентифицировав аппаратное обеспечение, а затем проверив, НЕОБХОДИМО ли это оборудование во встроенном программном обеспечении. Некоторые вещи просто работают. Оборудование можно обнаружить, используя в Терминале либо команду > lspci, либо команду > lsusb.

4
02.09.2020, 13:25
2 ответа

По моему мнению, это связано с тем, что при выполнении внешней команды оболочка 1 )разветвляется, 2 )обрабатывает перенаправления в дочернем процессе, а 3 )exec является фактической командой.. С назначением var, выполненным в 2, в дочернем элементе он не виден родительской оболочке после выхода из запущенной программы. Со встроенной командой нет форка, и оболочка жонглирует fd по мере необходимости в основном процессе оболочки, и назначение переменной вступает в силу там.

Не то чтобы это имело большое значение, так как перенаправление в some external command {var}>/whateverв любом случае бесполезно. Внешняя команда не может знать, какой fd был открыт для нее, и хотя она может определить, какие fd у нее есть, могут быть другие, кроме открытого для перенаправления в этой строке, поэтому она не может надежно использовать этот fd для вывода. к /whatever. Вместо этого вы обычно используете фиксированный номер fd или имеете некоторый аргумент командной строки или переменную среды, чтобы указать номер fd для использования.

Но и здесь этого сделать нельзя, так как переменная еще не установлена ​​при обработке расширений в командной строке, поэтому передать ее запускаемой программе довольно сложно.unset var; /bin/echo "var=$var" {var}>/dev/nullвыводит только var=, как и unset var; var=$var /usr/bin/env {var}>/dev/null |grep ^var. (Хотя в ksh и zsh последний, похоже, передает фактическое число через окружение.)

Единственное место, где такое перенаправление, кажется, имеет смысл, это exec {var}>/whatever, и это встроенная переменная, установленная в основной оболочке, и значение есть для использования следующими командами.

2
18.03.2021, 23:08

Документация GNU bash, раздел 3.6 Параграф 2 гласит: «Каждое перенаправление…».

Независимо от того, используется ли фактически fd в такой команде, как cmd {fd}>file, любая встроенная команда -устанавливает fd, а любая внешняя команда не устанавливает fd. Либо bash, либо руководство неправильно.

Paul--) echo "Hello, Worms" {var}>real 1>&${var}
Paul--) declare -p var; ls -l real; cat real
declare -- var="11"
-rw-r--r-- 1 paul paul 13 Sep  2 10:27 real
Hello, Worms
Paul--) 
Paul--) /bin/echo "So long, suckers" {why}>deal 1>&${why}
Paul--) declare -p why; ls -l deal; cat deal
bash: declare: why: not found
-rw-r--r-- 1 paul paul 17 Sep  2 10:29 deal
So long, suckers
Paul--) 

На самом деле значение $why доступно во втором перенаправлении (стандартного вывода ), но не так, как указано в Руководстве :«Если указано {varname}, перенаправление сохраняетсявыходит за рамки повеления... ».

Единственным преимуществом такого назначения, по-видимому, является то, что оно присваивает свободный fd по имени, вместо того, чтобы кодеру приходилось отслеживать численно:

: 9>myFirstFile
cmd >&9

: {fdLog}>myLogFile
cmd >&${fdLog}
1
18.03.2021, 23:08

Теги

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