Я пытаюсь создать сценарий, который изменит обои автоматически, когда выполнено.
#!/bin/bash
cd ~/
rm -r ~/.wallpaper
mkdir .wallpaper
cd ~/.wallpaper
wget https://source.unsplash.com/random/1920x1080
USER=$(whoami)
PATH="file:///home/$USER/.wallpaper/1920x1080"
echo $PATH
gsettings set org.gnome.desktop.background picture-uri "$PATH"
Но когда я делаю ./change_wallpaper.sh
Я получаю эхо правильно, но затем
./change_wallpaper.sh: строка 12: gsettings: команда, не найденная
Однако, когда я выполняю ту же команду от терминала, она выполняется прекрасный, и обои становятся измененными.
Когда я работаю whereis gsettings
это говорит
gsettings:/usr/bin/gsettings/usr/share/man/man1/gsettings.1.gz
Почему это показывает gsettings: command not found
когда я выполняюсь из сценария?
Потому что вы изменили PATH
в вашем скрипте. Эта зарезервированная переменная используется для поиска исполняемых файлов. Используйте другую переменную.
То же самое с USER
: он также зарезервирован и уже содержит текущего пользователя, т.е. вам не нужно устанавливать USER=$(whoami)
.
В общем, при создании переменных в скриптах оболочки рекомендуется использовать строчные имена. Обычно предопределенные переменные (например, HOME
, USER
, PATH
) имеют верхний регистр, и простой способ избежать их перезаписи - использовать строчные имена в собственных скриптах. Или используйте какой-нибудь префикс, например MY_PATH
, MY_USER
и т. Д.
Ваш сценарий не будет работать на всех. Переменная, которую Вы устанавливаете для дома для Вашего пользователя, будет неправильной для людей, у которых есть их HOME
местоположение в другом месте от /home/user
. Например, мое исходное расположение для моего личного пространства /home/user/l/j/ljames
.
Вместо того, чтобы установить путь, чтобы быть "file:///home/$USER/.wallpaper/1920x1080"
необходимо более правильно изменить его на "file:///$HOME/.wallpaper/1920x1080"
. Переменная $HOME
уже расширен до полного домашнего пространства пользователя.
Ваш сценарий будет работать если с этими изменениями:
#!/bin/bash
cd ~/
rm -r ~/.wallpaper
mkdir .wallpaper
cd ~/.wallpaper
wget https://source.unsplash.com/random/1920x1080
# USER=$(whoami) This line isn't neccesary.)
path="file:///$HOME/.wallpaper/1920x1080"
echo $path
gsettings set org.gnome.desktop.background picture-uri "$path"
Более эффективный пример:
#!/bin/bash
[ ! -d ~/.wallpaper ] && mkdir ~/.wallpaper
cd ~/.wallpaper
wget -O 1920x1080 https://source.unsplash.com/random/
path="file:///$HOME/.wallpaper/1920x1080"
rm ~/.cache/wallpaper/*
gsettings set org.gnome.desktop.background picture-uri "$path"
Объяснение строк:
Line #1: Create wallpaper directory if it doesn't exist.
Line #2: Move to the folder.
Line #3: Overwrite the current file with the new wallpaper.
Line #4: Set the pathname variable.
Line #5: Removed the Wallpaper cache for image change detection.
Line #6: Active the new wallpaper.