Я могу объяснить ошибку /dev/snd/pcmC0D0p
:Это устройство ALSA. Когда Pulseaudio запускается, он открывает все устройства ALSA, которые он может найти, и, поскольку аппаратные устройства ALSA не могут использоваться совместно и могут быть открыты только один раз, устройство выдает ошибку «занято» в следующий раз, когда кто-то пытается его открыть.
Таким образом, если вы запускаете Pulseaudio в своей основной среде и настроили виртуальный бокс только для «пропускания» звуковых устройств, основной Pulseaudio использует это устройство, а виртуальный бокс — нет.
Если virtualbux эмулирует звуковое устройство, у вас есть что-то еще, работающее в виртуальном боксе, который его открывает, например, второй экземпляр Pulseaudio. Используйте lsof
и ps
, чтобы узнать, какой из них.
Modprobing snd-pcm-oss
на самом деле не помогает :Это уровень эмуляции OSS в ALSA, он обеспечивает /dev/dsp
и т. д.,который является просто псевдонимом /dev/snd/pcmC0D0p
с другим API. И если вы включите оба module-alsa-sink
и module-oss
в Pulseaudio, Pulseaudio с радостью откроет оба, что, конечно, нонсенс. Так что отключите OSS снова, это не решение.
По моему опыту, pulseaudio -vvvv
достаточно, чтобы дать вам некоторое представление о том, что на самом деле идет не так. Если вы действительно получаете сбой, например, "нарушение сегментации" и т. д., используя strace
или запуская его с помощью gdb
, если это возможно в версии с символами отладки, вы снова должны понять, что на самом деле идет не так.
Я подозреваю, что в вашей конфигурации где-то есть подвох, но у меня недостаточно информации, чтобы понять это.
Если есть определенная линия, которую нужно сделать условно невосприимчивой к set -e
, это работает:
false || true
Можно сократить до:
false || :
Или наиболее загадочно:
false||:
Если строк несколько, заключите их в фигурные скобки:
{ false; false; } || true
Обратите внимание, что false
здесь представляет собой заставку -для любого кода, который может возвращать код ошибки. Конечно, false
ничего не выводит; но что-то вроде ls /bin/bash /bin/bbbbbbbash
будет печатать в STDOUT и STDERR , и с использованием вышеуказанного метода это все равно будет.
Или окружить код, который нужно сделать невосприимчивым, с помощью операторов set
:
set +e; false ; set -e
Обратите внимание, :вышеуказанные методы работают независимо от того, возвращают ли рассматриваемые строки код ошибки или успешно. Если известно, что определенная строка обязательно вернет ошибку, все, что нужно, — это начальный!
:
! false
В вашем вопросе недостаточно контекста, чтобы определить, чего вы на самом деле хотите достичь, но man bash ясно, что с помощью set -e
ваш скрипт завершится немедленно, когда не -получен нулевой статус выхода, За исключением случаев, когда неудачная команда является частью:
while
или until
; if
или elif
; &&
или ||
, за исключением команды, следующей за последней командой &&
или ||
; '!'
. Таким образом, у вас есть несколько вариантов, помимо подоболочки, чтобы организовать вашу команду как часть, чтобы гарантировать выполнение следующей строки, если ваша команда завершается сбоем с не -нулевым возвратом