gsettings: команда, не найденная

Я пытаюсь создать сценарий, который изменит обои автоматически, когда выполнено.

#!/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 когда я выполняюсь из сценария?

3
задан 8 April 2018 в 11:11

2 ответа

Потому что вы изменили PATH в вашем скрипте. Эта зарезервированная переменная используется для поиска исполняемых файлов. Используйте другую переменную.

То же самое с USER: он также зарезервирован и уже содержит текущего пользователя, т.е. вам не нужно устанавливать USER=$(whoami).

В общем, при создании переменных в скриптах оболочки рекомендуется использовать строчные имена. Обычно предопределенные переменные (например, HOME, USER, PATH) имеют верхний регистр, и простой способ избежать их перезаписи - использовать строчные имена в собственных скриптах. Или используйте какой-нибудь префикс, например MY_PATH, MY_USER и т. Д.

4
ответ дан 1 December 2019 в 13:15

Ваш сценарий не будет работать на всех. Переменная, которую Вы устанавливаете для дома для Вашего пользователя, будет неправильной для людей, у которых есть их 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.
4
ответ дан 1 December 2019 в 13:15

Другие вопросы по тегам:

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