Как запустить следующую строку bash, даже если включен set -e

Я могу объяснить ошибку /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, если это возможно в версии с символами отладки, вы снова должны понять, что на самом деле идет не так.

Я подозреваю, что в вашей конфигурации где-то есть подвох, но у меня недостаточно информации, чтобы понять это.

0
18.05.2019, 09:18
2 ответа

Если есть определенная линия, которую нужно сделать условно невосприимчивой к 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
0
28.01.2020, 02:40

В вашем вопросе недостаточно контекста, чтобы определить, чего вы на самом деле хотите достичь, но man bash ясно, что с помощью set -eваш скрипт завершится немедленно, когда не -получен нулевой статус выхода, За исключением случаев, когда неудачная команда является частью:

  • список команд сразу после ключевого слова whileили until;
  • тест, следующий за зарезервированными словами ifили elif;
  • любая команда, выполненная в списке &&или ||, за исключением команды, следующей за последней командой &&или ||;
  • любая команда в конвейере, кроме последней; или
  • , если возвращаемое значение команды инвертируется с помощью '!'.

Таким образом, у вас есть несколько вариантов, помимо подоболочки, чтобы организовать вашу команду как часть, чтобы гарантировать выполнение следующей строки, если ваша команда завершается сбоем с не -нулевым возвратом

1
28.01.2020, 02:40

Теги

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