Bash script doesn't work when used with keyboard shortcut, but works in the console

With the help of AI I made a script, which toggles between the two audio devices chosen by me.

Since the name of the device changes on each system reboot, the script finds the devices by their property from pactl: device.product.name (for example Sound BlasterX G6) and then finds the corresponding name (for example alsa_output.usb-Creative_Technology_Ltd_Sound_BlasterX_G6_F3004F4766X-00.analog-stereo).

The script works well, when used in the console with /home/yan/Skrypty/sink-switch2.sh.
The log output looks then like that:

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

However when I set the keyboard shortcut in GNOME settings:
enter image description here

It doesn’t work and the log looks like that:

Start
SPEAKERS_NAME:
SOUNDBLASTER_NAME:
DEFAULT:alsa_output.pci-0000_08_00.4.analog-stereo
Change to:
End

Why it doesn’t work as a shortcut?

The script:

#!/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

Difference between environments:

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/user@1000.service/session.slice/org.gnome.Shell@x11.service/memory.pressure
---
> MANAGERPID=2239
> MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/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
Asked By: Ap0st0l

||

As determined in the comments’ section by comparing the environments in which the script is run using env, turns out that LANG was set to pl_PL.UTF-8 when the script was running as a shortcut, which broke the parsing of the (localized) pactl commands;

Setting LC_ALL to en_GB.UTF-8, the same locale under which the script was working when running in the terminal fixed the issue:

export LC_ALL=en_GB.UTF-8

Note that setting LC_ALL is a catch-all solution that overrides every locale setting (that is LANG and every LC variable), but in this very specific case, since no other LC variables were set differently in the two environments (or comparing the environments would’ve shown the difference) and hence no other LC variables were actively affecting the output of pactl, setting just LANG would’ve worked out just the same, and in this case it would have been the "right" way to fix the issue:

export LANG=en_GB.UTF-8
Answered By: kos