Большинство звуковых карт (вы не сказали, какие из них у вас установлены) позволяют полностью отключить звук в ALSA, отключив "Master" или аналогичное управление микшером.Большинство дистрибутивов (вы не сказали, какой из них используете) позволяют загружать настройки ALSA по умолчанию на сравнительно ранней стадии процесса загрузки (например, alsa-utils
в Debian), и это должно заглушать звук перед тем, как приложение действительно хочет воспроизводить любой звук таким образом.
Если вы также хотите отключить внутренний динамик ПК, это немного сложнее: я бы, вероятно, попытался внести в черный список модуль pcspkr
, но я не уверен, работает ли это.
Обе эти модификации не должны перезаписываться обновлениями пакетов.
Ваш пример case
мне подходит, но обратите внимание, что вы сравниваете конкатенацию из A
и B
, поэтому шаблон будет соответствовать и в том случае, если, скажем, A
будет xy
, а B
будет пустым. (Я думаю, что двойные кавычки в середине лишние). case
берет только одно слово для сравнения с шаблонами, поэтому вы не можете сравнивать несколько переменных, кроме как путем конкатенации.
В стандартной команде test
, или [
, оператором сравнения является =
. ==
работает в некоторых системах, но не во всех. Кроме того, объединение условий с помощью -a
проблематично, по крайней мере, с условиями типа -n
. (см. этот вопрос). Лучше использовать if [ "$A" = x ] && [ "$B" = y ] ; then ...
.
Что касается инвертирования case
, вам нужно придумать шаблон, который соответствует всему, кроме целевой строки. extglob
в Bash и других позволяет искать соответствие всему, кроме:
case $B in !(y) ) echo not y ;; esac
Без него вам придется проделать дополнительную работу по инвертированию шаблона, или использовать несколько шаблонов, первые из которых будут соответствовать строке, а последующие по умолчанию будут выполнять фактическое действие.
case $B in ??*) echo not y ;; [^y]) echo also not y ;; esac
case $B in y) ;; *) echo still not y ;; esac
(никаких гарантий, особенно в первом случае. Честно говоря, вся идея делать это кажется ужасной.)
В любом случае, поскольку вы упомянули о причинах производительности, вы можете рассмотреть возможность перехода на Perl или Python вместо shell, не столько из-за простых сравнений, сколько потому, что они позволят вам делать больше без вызова внешних программ (таких как grep
, sed
, cut
или jq
). Кроме того, первое правило оптимизации производительности: измерьте разницу.
# $A = "x" && $B = "y"
case ${A:--}/${B:--} in 'x/y' ) let a=a+1;; esac
# $A = "x" && $B != "y"
case $A in 'x' ) case $B in '' | ??* | [!y] ) let a=a+1;; esac;; esac