Как точно делает 'если $cmd; затем $cmd; fi' отличаются от '$cmd && $cmd'?

Это - вид косвенного ответа, потому что я не вижу, почему Вы имели бы небесплатное программное обеспечение в системе и не знали бы об этом. Нельзя сказать Вы неправы хотеть проверить, но возможно сначала Вы хотите остановиться и думать, должны ли Вы действительно.

Я хотел бы эту функциональность на Fedora

Репозитории Fedora разделены на 'свободный' и 'несвободное'. По умолчанию только свободные репозитории используются. Таким образом, если Вы никогда не добавляли никакие другие репозитории, затем yum ничего не мог установить от них.

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

Посмотрите эту страницу. Единственная мягкая фетровая шляпа исключения делает, для "двоичного встроенного микропрограммного обеспечения", которое не требуется, если Вы не используете определенные аппаратные средства. Я думаю, что Вы знали бы, что также, но я не могу обещать.

Я полагаю, что "встроенное микропрограммное обеспечение" технически установлено на устройстве, и технически это уже там так или иначе. Например, Ваш BIOS запускает небесплатное программное обеспечение. На том уровне нет ничего, что можно сделать. Можно также считать обсуждение мягкой фетровой шляпы "двоичного встроенного микропрограммного обеспечения" по ссылке на той странице.

Само ядро не может содержать небесплатный код, оно может только закончиться в модуле. Если Вы загружаете источник с kernel.org и компилируете Ваше собственное, я не думаю, что он содержит что-либо того вида, начиная с отношения Linus ("Я отчасти принимаю их, но я никогда не поддерживаю их, и мне не нравятся они"), подразумевает, что несвободным модулям позволяют использоваться с ядром, но очень вряд ли быть распределенными надлежащим Linux (то есть, kernel.org). Собственные драйверы независимо распределяются; дистрибутивы затем включают их, не kernel.org (однако, согласно той странице "Forbidden Items", мягкая фетровая шляпа явно не включает собственные драйверы, по крайней мере, в 'свободном' repos по умолчанию).

Вы могли исследовать онлайн весь материал, перечисленный lsmod. Так как любой двоичный блоб должен быть модулем, мне кажется, это - то, где Вы найдете его.

Fedora рекомендует, если Вы хотите создать свое собственное ядро, использовать исходный пакет от них. Однако я использовал скрученные вручную ядра из ванильных источников kernel.org на мягкой фетровой шляпе в течение многих лет и никогда не имел проблему. Таким образом, если Вы - удобное выполнение это и не используете несвободные репозитории, у Вас не должно быть несвободного установленного материала.

5
02.06.2014, 00:27
2 ответа

Только простые случаи могут быть выражены с помощью && и || . Конструкция if является более общей. , если СОСТОЯНИЕ; затем FOO; fi эквивалентен CONDITION && FOO (при условии правильного использования фигурных скобок для разделения блока, если необходимо), но как только появляется else (или elif ), это вообще невозможно.

if CONDITION; then FOO; else BAR; fi

не эквивалентно

CONDITION && FOO || BAR

. Если УСЛОВИЕ истинно, обе конструкции выполняют FOO . Если FOO ложно, то конструкция if пропускает BAR , тогда как конструкция &&… || выполняет BAR ].

И нет, вы не можете обойти это с помощью CONDITION && {FOO; правда; } || BAR . Это заставляет составную команду возвращать истину, если CONDITION истинно, а FOO - ложно, тогда как , если CONDITION; затем FOO; else BAR; fi в этом случае возвращает false.

Это из-за смысловой разницы. Кроме того, есть удобочитаемость: вложенное использование && и || очень быстро становится трудным для расшифровки. Фактически, я не рекомендую использовать оба в одной команде - особенно с учетом того, что два оператора имеют одинаковый приоритет в оболочке, тогда как они имеют разные приоритеты в C и большинстве других языков, основанных на C (включая Perl и Ruby).

3
27.01.2020, 20:40

если тест-лист; тогда еще ... fi и список тестов && thenlist || elselist в целом не эквивалентны. Разница в том, что в if конструируется ровно один из thenlist и выполняется elselist . В другом случае это зависит от кода выхода thenlist (и возможных блоков eliflist ).

Таким образом, вы должны добавить (например) true в конец выбранного списка результатов, чтобы список имел тот же код выхода, что и тестовый список, который вызвал его выполнение.

if true; then
  echo true
  test -e doesntexist
else
  echo false
fi

можно переписать с помощью && и || , убедившись, что код выхода из кодовых блоков. Вместо

true && { echo true; test -e doesntexist; } || echo false

вам понадобится

true && { echo true; test -e doesntexist; true; } || echo false

elif

if test -e exists; then
  echo true
elif test -e doesntexist
  echo elif
else
  echo false
fi

будет

test -e exists && { echo true; true; } ||
  { test -e doesntexist && { echo elif; true; } || echo false; }
1
27.01.2020, 20:40

Теги

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