実行時に壁紙を自動的に変更するスクリプトを作成しようとしています。
#!/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/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.