Mac OS X에서 시간대별로 배경 화면을 변경하고 싶습니다.

하고 싶은 일



프로그래밍에 집중하고 있으면 「깨달으면 밤에!」같은 일이 있었으므로, 벽지가 시간대마다 마음대로 바뀌도록 해 보았습니다.

그냥 좋은 앱이 없었고 스스로 네이티브 앱을 만드는 것은 기술적으로 엄격하기 때문에 이번에는 쉘 스크립트 & cron으로했습니다.
주의 : 우리 쉘 스크립트, cron, osascript의 이해가 얕기 때문에 사용하는 경우는 자기 책임으로 부탁드립니다.

동작 확인 환경 등


  • OS: Mac OS X EL Capitan ver.10.11.6
  • Terminal: iTerm2 Build 3.1.5
  • osascript 명령
  • crontab 명령
  • OS 표준 로그인시 자동 실행 기능

  • 절차



    1. 벽지로 하고 싶은 화상을 준비해 둔다



    저장 위치는 어디서나 좋지만 그림 폴더가 좋다고 생각합니다.

    이번에는 다음 장소에 저장했습니다.~/Pictures/wallpaper/
    파일 이름
    - wp_daytime.jpg -> 낮에 표시되는 이미지
    - wp_evening.jpg -> 저녁에 표시되는 이미지
    - wp_night.jpg -> 밤에 표시되는 이미지

    2. 시간대에 따라 배경화면을 바꾸는 쉘 스크립트 만들기



    터미널을 시작하고 다음 절차에 따라 쉘 스크립트를 만듭니다.
    터미널은 일단 iTerm2를 사용했지만, 뭐든지 좋다고 생각합니다.
    # 作業用フォルダに移動(なければmkdirコマンドで作る)
    $ cd ~/work/scripts
    # シェルスクリプトを新規作成(.shだと起動時に自動実行できなかったので.command)
    $ vim set_wallpaper_by_time.command
    

    set_wallpaper_by_time.command의 내용
    #!/bin/bash
    
    function usage() {
    cat <<_EOT_
    Usage:
      $0 [OPTION]...
    
    Description:
      set wallpaper by time.
    
    Options:
      -h,--help       display help
      --skip-waiting  skip waiting for connection to multi monitor
    
    _EOT_
    exit 
    }
    
    # オプション処理
    for arg in "$@"; do
      shift
      case "$arg" in
        --help)  set -- "$@" "-h" ;;
        --skip-waiting)   skip_waiting=1   ;;
        *) set -- "$@" "$arg" ;;
      esac
    done
    
    while getopts hl: opts
    do
      case $opts in
        h) usage ;;
        \?)
          echo illegal option -- $OPTARG >&
          usage ;;
      esac
    done
    
    # 起動してすぐに実行するとマルチモニタ側の壁紙が変わらなかったので少し待つ
    if [[ ! $skip_waiting ]]; then
      echo "Waiting for connection to multi monitor to be completed..."
      sleep 60s
    fi
    
    # メイン処理
    echo "Start setting wallpaper"
    current_time=`date +%H%M`
    
    if [ "$current_time" -ge 700 -a "$current_time" -lt 1700 ]; then
      osascript -e 'tell application "System Events" to set picture of every desktop to "~/Pictures/wallpaper/wp_daytime.jpg"'
    elif [ "$current_time" -ge 1700 -a "$current_time" -lt 1800 ]; then
      osascript -e 'tell application "System Events" to set picture of every desktop to "~/Pictures/wallpaper/wp_evening.jpg"'
    else
      osascript -e 'tell application "System Events" to set picture of every desktop to "~/Pictures/wallpaper/wp_night.jpg"'
    fi
    
    echo Done.
    exit 0
    

    터미널로 돌아가서 다음 명령으로 동작을 확인할 수 있습니다.
    $ ~/work/scripts/set_wallpaper_by_time.command
    

    3. 매시간 자동으로 실행



    cron을 사용하여 매시간 자동으로 실행되도록 설정합니다.
    구성에는 crontab 명령을 사용합니다.
    # 実行権限を付与
    $ chmod +x set_wallpaper_by_time.command
    # 付与できたか確認
    $ ls -l set_wallpaper_by_time.command
    -rwxr-xr-x  1 username  usergroup  154 12 22 10:37 set_wallpaper_by_time.command
    
    # エディタを指定してからcron jobの設定を編集
    $ export EDITOR=vim
    $ crontab -e
    # open vim
    

    다음 내용을 추가합니다.
    # usage
    # min hour day month weekday script
    
    # change wallpaper hourly (without mail)
    0 * * * * ~/work/scripts/set_wallpaper_by_time.command --skip-waiting 1> /dev/null
    
    # every 30 minutes (without mail)
    # */30 * * * * ~/work/scripts/set_wallpaper_by_time.command --skip-waiting 1> /dev/null
    

    4. 부팅시에도 실행


  • 시스템 환경 설정 -> 사용자 및 그룹 -> 로그인 항목을 엽니 다
  • [+] 버튼을 눌러 방금 만든 Command 파일을 선택
  • 목록에 추가되므로 확인을 완료

  • 문제점


  • 전체 화면에서 앱을 표시하는 모니터는 배경 화면이 변하지 않는다.
  • 멀티 데스크탑으로 표시하고 있는 모니터는, 활성 데스크탑 이외의 벽지가 변하지 않는다.
  • 자신의 환경에서만 동작 확인하고 있다.

  • 빠진 곳



    1. 멀티 모니터 환경에서 메인 모니터 만 배경 화면이 변경됩니다.


    osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Aqua Blue.jpg"'
    

    같은 방식으로 벽지를 변경하도록 쓰여 있는 기사가 많았지만, 이것이라고 메인 모니터 밖에 배경 화면이 변경되지 않았습니다.
    osascript -e 'tell application "System Events" to set picture of every desktop to "~/Pictures/desktop-pc-5120x2880-wallpaper_00074.jpg"'
    

    하는 것으로 해결되었습니다.

    2. *.sh라면 OS 기동시에 실행해 주지 않는다



    *.sh라고 기동시에 에디터로 열려 버렸다.
    *.command로 수정하면 실행되었습니다.

    후기



    벽지를 바꾸는 것만으로 상당히 큰 작업이 되어 버렸습니다만, 쉘 스크립트나 cron의 공부 목적으로 해 보았습니다.
    문제점이나 오자 탈자의 지적은 대환영입니다. 또한 이것을 사용하면 실현 가능하거나 쉽게 만들 수 있다면 알려주십시오.

    참고



    How do I change desktop background with a terminal command? - StackExchange
    Mac에서 cron. - Developers.IO
    Mac에서 로그인 할 때 스크립트 실행 (Automator 사용 안 함) - Qiita
    bash 코딩 규칙 - Qiita
    쉘 스크립트 (bash) if 문과 test 명령 ([]) 자신 메모

    좋은 웹페이지 즐겨찾기