Com a ajuda da IA fiz um script, que alterna entre os dois dispositivos de áudio escolhidos por mim.
Como o nome do dispositivo muda a cada reinicialização do sistema, o script localiza os dispositivos por suas propriedades em pactl: device.product.name
(por exemplo Sound BlasterX G6
) e, em seguida, encontra o nome correspondente (por exemplo alsa_output.usb-Creative_Technology_Ltd_Sound_BlasterX_G6_F3004F4766X-00.analog-stereo
).
O script funciona bem quando usado no console com /home/yan/Skrypty/sink-switch2.sh
. A saída do log fica assim:
Start
SPEAKERS_NAME:alsa_output.pci-0000_08_00.4.analog-stereo
SOUNDBLASTER_NAME:alsa_output.usb-Creative_Technology_Ltd_Sound_BlasterX_G6_F3004F4766X-00.analog-stereo
DEFAULT:alsa_output.pci-0000_08_00.4.analog-stereo
Change to:alsa_output.usb-Creative_Technology_Ltd_Sound_BlasterX_G6_F3004F4766X-00.analog-stereo
End
No entanto, quando defino o atalho de teclado nas configurações do GNOME:
Não funciona e o log fica assim:
Start
SPEAKERS_NAME:
SOUNDBLASTER_NAME:
DEFAULT:alsa_output.pci-0000_08_00.4.analog-stereo
Change to:
End
Por que não funciona como atalho?
O roteiro:
#!/bin/bash
# Starship/Matisse HD Audio Controller
# Sound BlasterX G6
echo "Start" >> /home/yan/Skrypty/log.txt
DEFAULT=$(pactl get-default-sink)
# device.product.name
SPEAKERS="Starship/Matisse HD Audio Controller"
SOUNDBLASTER="Sound BlasterX G6"
# getting real name
SPEAKERS_NAME=$(pactl list sinks | grep -B 1 "Description:.*$SPEAKERS" | grep "Name:" | sed 's/Name: //' | tr -d '[:space:]')
SOUNDBLASTER_NAME=$(pactl list sinks | grep -B 1 "Description:.*$SOUNDBLASTER" | grep "Name:" | sed 's/Name: //' | tr -d '[:space:]')
echo "SPEAKERS_NAME:$SPEAKERS_NAME" >> /home/yan/Skrypty/log.txt
echo "SOUNDBLASTER_NAME:$SOUNDBLASTER_NAME" >> /home/yan/Skrypty/log.txt
echo "DEFAULT:$DEFAULT" >> /home/yan/Skrypty/log.txt
if [[ "$DEFAULT" == "$SPEAKERS_NAME" ]]
then
# change to Soundblaster
notify-send -e --expire-time=1000 "Zmiana dźwięku na: $SOUNDBLASTER"
echo "Change to:$SOUNDBLASTER_NAME" >> /home/yan/Skrypty/log.txt
pactl set-default-sink "$SOUNDBLASTER_NAME"
else
# change to speakers
notify-send -e --expire-time=1000 "Zmiana dźwięku na: $SPEAKERS"
echo "Change to:$SPEAKERS_NAME" >> /home/yan/Skrypty/log.txt
pactl set-default-sink "$SPEAKERS_NAME"
fi
echo "End" >> /home/yan/Skrypty/log.txt
Diferença entre ambientes:
yan@yan-ubuntu:~/Skrypty$ colordiff <(env | sort) <(sort /home/yan/Skrypty/log.txt)
1d0
< COLORTERM=truecolor
6a6
> GIO_LAUNCHED_DESKTOP_FILE_PID=15262
7a8
> GNOME_KEYRING_CONTROL=/run/user/1000/keyring
9,10d9
< GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/9d389c3d_3de5_4539_8fef_7d793c1c8b9c
< GNOME_TERMINAL_SERVICE=:1.191
17,19c16,18
< LANG=en_GB.UTF-8
< LESSCLOSE=/usr/bin/lesspipe %s %s
< LESSOPEN=| /usr/bin/lesspipe %s
---
> INVOCATION_ID=a27624429852440d9182ed33440a8c6a
> JOURNAL_STREAM=8:26020
> LANG=pl_PL.UTF-8
21,23c20,21
< LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:
< MANGOHUD=1
< MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/session.slice/[email protected]/memory.pressure
---
> MANAGERPID=2239
> MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/session.slice/org.gnome.SettingsDaemon.MediaKeys.service/memory.pressure
25,31c23,24
< NVM_BIN=/home/yan/.nvm/versions/node/v20.14.0/bin
< NVM_CD_FLAGS=
< NVM_DIR=/home/yan/.nvm
< NVM_INC=/home/yan/.nvm/versions/node/v20.14.0/include/node
< OLDPWD=/home/yan
< PATH=/home/yan/.nvm/versions/node/v20.14.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
< PWD=/home/yan/Skrypty
---
> PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
> PWD=/home/yan
38,39c31
< SYSTEMD_EXEC_PID=3047
< TERM=xterm-256color
---
> SYSTEMD_EXEC_PID=3241
43d34
< VTE_VERSION=7600
Conforme determinado na seção de comentários comparando os ambientes em que o script é executado usando
env
, verifica-se queLANG
foi definidopl_PL.UTF-8
como um atalho quando o script estava sendo executado, o que interrompeu a análise dospactl
comandos (localizados);Definir
LC_ALL
comoen_GB.UTF-8
, o mesmo local em que o script estava funcionando ao ser executado no terminal corrigiu o problema:Observe que a configuração
LC_ALL
é uma solução abrangente que substitui todas as configurações de localidade (ou seja,LANG
todas asLC
variáveis), mas neste caso muito específico, uma vez que nenhuma outraLC
variável foi definida de forma diferente nos dois ambientes (ou a comparação dos ambientes teria mostrado o diferença) e, portanto, nenhuma outraLC
variável estava afetando ativamente a saída depactl
, a configuraçãoLANG
teria funcionado da mesma forma e, neste caso, teria sido a maneira "certa" de corrigir o problema: