최소 세 가지 명령 사이를 전환하는 스크립트

최소 세 가지 명령 사이를 전환하는 스크립트

키 바인딩으로 호출할 때 다양한 명령(예: 아래에 표시된 4개의 다른 명령) 사이를 전환하는 bash 스크립트를 작성하는 방법.

스크립트는 마지막으로 호출되었을 때 어떤 명령이 중지되었는지 기억하고 최소한 세 개의 명령 사이를 전환할 수 있어야 합니다.

feh예를 들어, 다음을 사용하여 4개의 화면 배경화면 간에 전환하고 싶습니다. 어떻게 해야 합니까?

feh --bg-scale $dir_photos/20150620_182419_1.jpg
feh --bg-scale $dir_photos/20150620_182419_2.jpg
feh --bg-scale $dir_photos/20150620_182419_3.jpg
feh --bg-scale $dir_photos/20150620_182419_4.jpg

답변1

귀하의 질문을 이해하면 동일한 명령이 호출될 때마다 다른 출력을 생성하여 4개의 다른 파일을 순서대로 반복하기를 원합니다.

이렇게 하려면 다음 호출에 무엇이 필요한지 알 수 있도록 상태를 유지해야 합니다. 내 예에서는 현재 배경화면의 인덱스 번호(0..3)를 저장하겠습니다. 인덱스 번호가 사용 가능한 파일 수에 도달하면 %모듈로( ) 연산자를 사용하여 0으로 재설정됩니다.

#!/bin/bash
#
files=(20150620_182419_1.jpg 20150620_182419_2.jpg 20150620_182419_3.jpg 20150620_182419_4.jpg)
dir_photos="$HOME/Pictures"          # Directory of photos
state="$HOME/.${0##*/}.dat"          # File to maintain state

index=$(cat "$state" 2>/dev/null)    # Retrieve last index
nFiles=${#files[@]}                  # Number of entries in files()

# Set current index to zero if first time, otherwise next value in sequence
[[ -z "$index" ]] && index=0 || index=$((++index % nFiles))

printf "%d\n" $index >"$state"       # Save new index
# echo "State index=$index: ${files[index]}"

# Apply the wallpaper
feh --bg-scale "$dir_photos/${files[index]}"

파일로 저장하고 실행 가능하게 만드세요. 그런 다음 키를 바인딩하여 이 스크립트를 호출하세요.

$dir_photos디렉터리의 모든 파일을 반복하도록 수정할 수 있습니다 .

dir_photos="$HOME/Pictures"          # Directory of photos
files=("$dir_photos"/*)              # All files in the directory
...
feh --bg-scale "${files[index]}"

답변2

내 해결책은 다음과 같습니다. 이 작은 루프를 백그라운드에서 실행하고 각 옵션을 단축키에 연결할 수 있을 것 같은데, 이것이 원래 의도였습니다. 하지만 단축키를 통해 백그라운드 프로세스에 연결하는 방법을 모르겠습니다.

#!/bin/bash

# set an infinite loop until option is set and quit

while :
do
    clear
    
    # display menu
    echo "  --------------------------------------------------"
    echo "     W A L L P A P E R   C H A N G E R - M E N U"
    echo "  --------------------------------------------------"
    echo
    echo "  1   wall paper 1"
    echo
    echo "  2   edit wall paper 1"
    echo
    echo "  3   wall paper 2"
    echo
    echo "  4   wall paper 3"
    echo
    echo "  5   wall paper changer - does not work yet"
    echo
    echo "  6   this script: pcmanfm to dir location"
    echo
    echo "  7   this script: edit this script"
    echo
    echo "  8   display network connections"
    echo
    echo "  q   exit"
    echo
    echo

    # set-up reference directories

    dir_z="/home/$USER/Dropbox/script_screen_SAVER_feh"
    dir_photos="/home/$USER/wall_papers"

    # get input from the user 
    read -p "  enter your choice [ 1 - 7  or   q/Q ] " choice
        
    # make decision using case..in..esac 
    case $choice in
        1)
            feh --bg-scale $dir_photos/20210620_182419_3.jpg
            echo "wall paper 1"
            exit 0
            ;;
        2)
            gimp $dir_photos/20210620_182419_3.xcf
            echo "wall paper 1, edit image"
            ;;
        3) 
            feh --bg-scale $dir_photos/20210620_182419_1.jpg
            echo "Quotes"
            exit 0
            ;;
        4) 
            feh --bg-scale $dir_photos/20210621_135308.jpg
            echo "The sea - wall paper"
            exit 0
            ;;
        5)
            # kill previously running wallpaper changer process
            ps aux | grep "feh/" | awk '{print $2}' | xargs kill -15
            # change the wallpaper every 5 seconds
            bash -c 'while : ;do feh --randomize --bg-fill --auto-rotate $dir_photos/*.jpg; sleep 5; done' &
            disown
            echo "wall paper changer"
            exit 0
            ;;
        6) 
            pcmanfm $dir_photos
            echo "pcmanfm directory"
            ;;
        7) 
                        nvim $dir_z/more_than_3_screens_switcher.sh
            echo "editing this script"
            ;;
        8)
            netstat -nat
            read -p "Press [Enter] key to continue..." readEnterKey
            ;;
        q)
            echo "Bye!"
            exit 0
            ;;
        Q)
            echo "Bye!"
            exit 0
            ;;      *)
            echo "Error: Invalid option..." 
            ;;


    esac        
                
done

관련 정보