Кажется, вы хотите запросить carrier
файлы в /sys/class/net/*/
, чтобы узнать, есть ли хотя бы один, указывающий, находитесь ли вы в сети или нет, (игнорируя*/lo/carrier
).
С петлей-раковиной:
#!/bin/sh
online=0
for carrier in /sys/class/net/*/carrier; do
case "$carrier" in
*/lo/carrier) continue ;;
esac
if read online <"$carrier" && [ "$online" -eq 1 ]; then
break
fi
done
if [ "$online" -ne 1 ]; then
echo 'not online' >&2
exit 1
fi
Использованиеbash
:
#!/bin/bash
shopt -s extglob
online=0
for carrier in /sys/class/net/!(lo)/carrier; do
if read online <"$carrier" && [ "$online" -eq 1 ]; then
break
fi
done
if [ "$online" -ne 1 ]; then
echo 'not online' >&2
exit 1
fi
Или, как bash
"почти -один -лайнер"
#!/bin/bash
shopt -s extglob
grep -qx 1 /sys/class/net/!(lo)/carrier || ! echo not online >&2
Последнее предполагает, что файлы содержат одну цифру 1
, если этот носитель находится в сети и что нет данных, или, по крайней мере, нет 1
, если это не так.
Циклы выше (с использованиемread
)будут считывать только первую строку из каждого файла carrier
, пока не будет найден файл 1
.
Проблема в вашем коде заключается в подстановке команд $(/sys/class/net/*)
, которая попытается выполнить первое совпадающее имя файла как команду с другими совпадающими именами файлов в качестве аргументов.
Кроме того, проверка [ $OnLine ]
будет "истинной", если $OnLine
не является -пустым. Я не уверен, что содержат файлы, которые вы анализируете, если носитель не находится в строке -, но даже ноль здесь будет восприниматься как «истина».
Общее правило заключается в том, что если Install-Recommends
включено, то для установки учитываются рекомендации вновь -установленных пакетов,и это применяется транзитивно — для нового -установленного пакета, выбранного по рекомендации, будут учитываться собственные рекомендации для установки.
Однако другие соображения могут помешать установке рекомендации, и поскольку это всего лишь рекомендация, это не будет считаться фатальной ошибкой. В примере hollywood
run-one
будет рассматриваться для установки, но в Debian он не будет установлен, потому что пакет недоступен (, это пакет Ubuntu ). Аналогичным образом, если рекомендуемый пакет конфликтует с уже -установленным пакетом, он не будет установлен. Любые дальнейшие зависимости или рекомендации такого пакета также не будут рассматриваться.
Все это применимо ко всем apt
операциям:install
очевидно, но также и upgrade
. Если обновление пакета вводит новую зависимость, которая еще не установлена, этот пакет будет установлен, и будет применяться описанная выше обработка вновь -установленных пакетов. С другой стороны, обновления пакетов, вводящие новые рекомендации, не приведут к дополнительным установкам, поскольку рекомендации не определены для вновь-установленных пакетов.
В моей системе уже есть less
, поэтому давайте подумаем о run-one
.
hollywood
|- [dep] byobu
| |- [rec] run-one
|
|- [rec] atop
| |- [rec] cron
Затем, когда я пытаюсь установить (удаляются неинтересные пакеты из текста):
$ sudo apt install -o APT::Install-Recommends="true" hollywood
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
atop byobu cron
Recommended packages:
run-one
The following NEW packages will be installed:
atop byobu cron hollywood
Похоже, что apt
делает следующее:
byobu
(dep )установлен, но его рекомендуемый пакет run-one
пока только рекомендуется. atop
(rec )установлен, и его рекомендуемый пакет:cron | cron-daemon
установлен. Чтобы обобщить то, что мы только что наблюдали при использовании этой опции,:
Меня удивило, что будет установлена рекомендация рекомендации. Я подтвердил, что cron
не является зависимостью одного из других пакетов, которые были бы установлены.