我正在尝试创建一个脚本,它将在运行时自动更改壁纸。
#!/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
当我从脚本执行时会显示它?
答案1
你的脚本并不适合所有人。HOME
对于与 不同位置的 用户,您为用户设置的 home 变量是不正确的/home/user
。例如,我的个人空间的 home 位置是/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.
答案2
因为您在脚本中更改了PATH
。此保留变量用于定位可执行文件。请使用另一个变量。
同理USER
:也是保留的,已经包含了当前用户,即不需要设置USER=$(whoami)
。
一般来说,在 shell 脚本中创建变量时,最好使用小写名称。通常,预定义变量(如HOME
、USER
、PATH
)都是大写的,避免覆盖它们的一个简单方法是在自己的脚本中使用小写名称。或者使用一些前缀,例如MY_PATH
、MY_USER
等。