web-dev-qa-db-ja.com

ブートごとにgrubバックグラウンドイメージを循環する方法

最終回答は既に投稿されています

質問全体を読む前に、以下の回答に注意してください。

質問のショートバージョン

Bashでは、このファイルの次のアイテムをどのように見つけることができますか?

  • .../640x480-a.jpg
  • .../640x480-b.jpg
  • .../640x480-c.jpg

現在のアイテムがこの文字列に埋め込まれているとき?

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が順番に並んでいると思います(コードのコメントでわかるように)。

いつものように、私はありとあらゆるアイデアに感謝しています。

2

短い答え

#!/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%解決されました。それから Pilot6Terdon および Zanna からのチャットルームでの驚くべき支援で(sedを使用して)解決されました。

cl-netbox および Byte Commander makeUbuntuに尋ねてくださいチャットルーム20年間でネット上で頻繁に利用した、最も友好的で最も均質なテクニカルチャットルーム。

Cronでブートごとにスクリプトを呼び出す

以下を含むファイル/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の再起動を設定する方法ですが、ログインパスワードが入力され、ターミナルウィンドウが開いて更新を確認するまでにプロセスが完了します。

2

システムの起動スクリプトのいずれかから実行される単純なスクリプトを使用すると、特定のフォルダー内の壁紙画像を、再起動ごとに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ドライブでは数秒で実行されるはずです。それは簡単で、ロジックは明白であり、数か月後または数年後、スタートアップによって呼び出されるこのスクリプトが何をするのか不思議に思わないでしょう。

1
Zeiss Ikon