質問全体を読む前に、以下の回答に注意してください。
Bashでは、このファイルの次のアイテムをどのように見つけることができますか?
現在のアイテムがこの文字列に埋め込まれているとき?
GRUB_BACKGROUND="/home/rick/Pictures/Wallpaper/640x480-a.jpg"
現在のアイテムが最後のファイルエントリである場合、最初のファイルエントリを選択する必要があります。新しいエントリは、次回のブートのためにgrubで更新する必要があります。
Grubには複数の背景画像があります。背景画像を変更するために/etc/default/grub
を手動で編集してからSudo update-grub
を実行するのは時間がかかり、忘れることが多いでしょう。起動/再起動のたびに自動的に行われるようにしたいと思います。
次を含む/etc/cron.d/cycle-grub-background
というcronジョブをセットアップしました。
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root /usr/local/bin/cron-reboot-cycle-grub-background
ラップトップが何日間も再起動されず、利用可能なgrub背景画像をスキップしたくない場合があるため、このジョブは毎日ではなく再起動ごとに実行されると確信しています。
次のコードは、歴史的な参考のためにのみ提供されています。ひどく壊れていて、デザインが悪いので、それを使わないでください。
ファイル/usr/local/bin/cron-reboot-cycle-grub-background
には以下が含まれます。
#!/bin/bash
# NAME: cron-reboot-cycle-grub-background
# DATE: February 18, 2017
# PATH: /usr/local/bin/
# DESC: Cycle through available 640x480 wallpaper for grub background
# Get list of all grub images when 1920x1080 monitor has been downgraded
# to more readable 640x480 pixel format
ls /home/rick/Pictures/Wallpaper/640x480* > /tmp/grub-backgrounds
# Find this boot grub background image name
cat /etc/default/grub | grep BACKGROUND > /tmp/grub-background
# case? to find current background in backgrounds?
# Can we run systemd inhibit lock to prevent shutdown or reboot now?
# sed? to change to next background in /etc/default/grub
# Copy /etc/default/grub to /boot/grub/grub.cfg is the same as
# running Sudo update-grub with out the 12 second delay
cp /boot/grub/grub.cfg /boot/grub/grub.cfg~
cp /etc/default/grub /boot/grub/grub.cfg
# Can we release systemd inhibitor now?
# Now next reboot will have new background image
exit 0
ファイル/tmp/grub-backgrounds
に以下が含まれているとしましょう:
640x480-a.jpg
640x480-b.jpg
640x480-c.jpg
ファイル/tmp/grub-background
に以下が含まれているとしましょう:
GRUB_BACKGROUND="/home/rick/Pictures/Wallpaper/640x480-a.jpg"
その場合、リストの次の画像は...640x480-b.jpg
になります。
ただし、現在の画像が...c.jpg
の場合、次の画像はリストの先頭にリセットされ、...a.jpg
になります。
この円をそのまま正方形にする必要があります。何らかの種類のfile case
に続いてsed
が順番に並んでいると思います(コードのコメントでわかるように)。
いつものように、私はありとあらゆるアイデアに感謝しています。
#!/bin/bash
CURR_FILE=$(cat /etc/default/grub | grep BACKGROUND) # Get grub current line
CURR_FILE=$(cut -d "=" -f 2 <<< "$CURR_FILE") # File name only
CURR_FILE=$(echo "$CURR_FILE" | tr -d '"') # Remove double quotes
for ALL_FILES in /home/rick/Pictures/Wallpaper/640x480*; do # Loop through every file
if [[ "$FIRST_FILE" == "" ]]; then
FIRST_FILE="$ALL_FILES"
Elif [[ "$MATCH_FILE" != "" ]]; then
NEXT_FILE="$ALL_FILES"
break # We've got it!
fi
if [[ "$CURR_FILE" == "$ALL_FILES" ]]; then
MATCH_FILE="$ALL_FILES" # We found our current file entry
fi
done
# If $NEXT_FILE empty we hit end of list so use First file name
if [[ "$NEXT_FILE" == "" ]]; then
NEXT_FILE="$FIRST_FILE"
fi
# replace background file name in grub source file
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /etc/default/grub
# replace background file name in grub configuration file
# Backup... just in case :)
cp /boot/grub/grub.cfg /boot/grub/grub.cfg~
# Short cut so we don't have to run `Sudo update-grub`
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /boot/grub/grub.cfg
今朝多くのグーグルで試行錯誤を繰り返した結果、問題は90%解決されました。それから Pilot6 、 Terdon および Zanna からのチャットルームでの驚くべき支援で(sed
を使用して)解決されました。
cl-netbox および Byte Commander makeUbuntuに尋ねてくださいチャットルーム20年間でネット上で頻繁に利用した、最も友好的で最も均質なテクニカルチャットルーム。
以下を含むファイル/etc/cron.d/cycle-grub-background
を作成します。
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root /usr/local/bin/cron-reboot-cycle-grub-background
注:Sudo
powersを使用してファイルを作成します。実行可能としてマークする必要はありませんが、そうしても害はありません。
#!/bin/bash
# NAME: cron-reboot-cycle-grub-background
# DATE: February 18, 2017. Modified April 9, 2017.
# PATH: /usr/local/bin/
# DESC: Cycle through available wallpaper for grub background
CURR_FILE=$(cat /etc/default/grub | grep BACKGROUND) # Get grub current line
echo "Grub line: $CURR_FILE"
CURR_FILE=$(cut -d "=" -f 2 <<< "$CURR_FILE") # File name only
CURR_FILE=$(echo "$CURR_FILE" | tr -d '"') # Remove double quotes
echo "Current file: $CURR_FILE"
FIRST_FILE=""
NEXT_FILE=""
MATCH_FILE=""
for ALL_FILES in /home/rick/Pictures/1600x900/*; do # Loop through every file
if [[ "$FIRST_FILE" == "" ]]; then
FIRST_FILE="$ALL_FILES"
fi
if [[ "$MATCH_FILE" != "" ]]; then
NEXT_FILE="$ALL_FILES"
break # We've got it!
fi
if [[ "$CURR_FILE" == "$ALL_FILES" ]]; then
MATCH_FILE="$ALL_FILES" # We found our current file entry
fi
done
# If $NEXT_FILE empty we hit end of list so use First file name
if [[ "$NEXT_FILE" == "" ]]; then
NEXT_FILE="$FIRST_FILE"
fi
echo "First file: $FIRST_FILE"
echo "Match file: $MATCH_FILE"
echo "Next file: $NEXT_FILE"
# replace background file name in grub source file
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /etc/default/grub
# replace background file name in grub control file
# Backup... just in case :)
cp /boot/grub/grub.cfg /boot/grub/grub.cfg~
# Short cut so we don't have to run `Sudo update-grub`
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /boot/grub/grub.cfg
# Now next reboot will have new background image
exit 0
長いバージョンの答えは、短いバージョンとは異なる画像ディレクトリ名を使用します。どちらの場合でも、画像が保存されているディレクトリに更新する必要があります。
sed
は通常、区切り文字として/
を使用しますが、パス/ファイル名には/
が含まれるため、代わりに|
を使用します。
/etc/default/grub
を変更した後の従来の方法は、Sudo update-grub
を実行することです。しかし、これは私のマシンで12秒かかります。この長いプロセスの実行中にマシンを再起動できます。 systemd-inhibit
を使用する必要がある場合。
ショートカットは、sed
を使用して/boot/grub/grub.cfg
内で検索および置換します。何か問題が発生した場合に備えて、ファイルのバックアップが作成されます。このマシンでcronの再起動を設定する方法ですが、ログインパスワードが入力され、ターミナルウィンドウが開いて更新を確認するまでにプロセスが完了します。
システムの起動スクリプトのいずれかから実行される単純なスクリプトを使用すると、特定のフォルダー内の壁紙画像を、再起動ごとに1ステップ実行できます。 update-grub
とはるかに単純なロジックを使用するよりもはるかに高速で、さらにupdate-grub
を実行する必要はありません。欠点は、リストに画像を追加する場合、スクリプトを編集するか、変数リストの長さを処理するためにやや複雑なスクリプトを作成する必要があり、ファイル名から各ファイルにどの画像があるかわからないことです。
mv wallpaper3.png wallpaperx.png
mv wallpaper2.png wallpaper3.png
mv wallpaper1.png wallpaper2.png
mv wallpaperx.png wallpaper1.png
数十個のファイルのリストがある場合でも、このスクリプトのより長い実世界バージョンは、SSDでは数分の一秒で、またはPlatterドライブでは数秒で実行されるはずです。それは簡単で、ロジックは明白であり、数か月後または数年後、スタートアップによって呼び出されるこのスクリプトが何をするのか不思議に思わないでしょう。