Я решил эту проблему:
sudo apt-get purge alsa-driver-linuxant https://help.ubuntu.com/community/SoundTroubleshootingПроцедураВы можете проверить, был ли сценарий оболочки запущен на терминале, анализируя вывод команды tty.
#! /bin/bash
if [[ $(tty) =~ "not a tty" ]]
then
echo "Not running on terminal"
else
echo "Running on terminal"
fi
Я проверил различия между средой при запуске скрипта из терминала и среды при запуске скрипта, дважды щелкнув его в файлах.
Когда вы запускаете скрипт, дважды щелкнув в «Файлы», $VTE_VERSION отключена, поэтому вы можете подключиться к ней, чтобы решить, заменить ли текущий экземпляр Bash интерактивным или нет.
То есть просто поместите это в конец вашего скрипта: [ ! d2]
#! /bin/bash
# ...
[ ! -z $VTE_VERSION ] && exec bash
Чтобы сделать эту работу также в случае запуска сценария из файла рабочего стола, измените строку Exec = рабочего стола на рабочем столе, например:
Exec=/path/to/script
Кому: [!d4 ]
Exec=sh -c '/path/to/script; exec bash'
Этот способ /path/to/script будет выполнен, а sh будет заменен Bash после завершения /path/to/script.
При двойном щелчке от Nautilus у вас не будет всей настройки среды, как в обычной сессии терминала. Я использую этот шаблонный код для предотвращения сбоев: введите ссылку здесь. Вы можете адаптировать его к вашим потребностям:
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
exit 1
fi