Mac OS X에서 시간대별로 배경 화면을 변경하고 싶습니다.
9214 단어 ShellScriptcron벽지MacOSX
하고 싶은 일
프로그래밍에 집중하고 있으면 「깨달으면 밤에!」같은 일이 있었으므로, 벽지가 시간대마다 마음대로 바뀌도록 해 보았습니다.
그냥 좋은 앱이 없었고 스스로 네이티브 앱을 만드는 것은 기술적으로 엄격하기 때문에 이번에는 쉘 스크립트 & cron으로했습니다.
주의 : 우리 쉘 스크립트, cron, osascript의 이해가 얕기 때문에 사용하는 경우는 자기 책임으로 부탁드립니다.
동작 확인 환경 등
절차
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. 부팅시에도 실행
# 作業用フォルダに移動(なければmkdirコマンドで作る)
$ cd ~/work/scripts
# シェルスクリプトを新規作成(.shだと起動時に自動実行できなかったので.command)
$ vim 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
# 実行権限を付与
$ 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
문제점
빠진 곳
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 명령 ([]) 자신 메모
Reference
이 문제에 관하여(Mac OS X에서 시간대별로 배경 화면을 변경하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ezawa800/items/fc6938ed20be07dbc407
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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"'
벽지를 바꾸는 것만으로 상당히 큰 작업이 되어 버렸습니다만, 쉘 스크립트나 cron의 공부 목적으로 해 보았습니다.
문제점이나 오자 탈자의 지적은 대환영입니다. 또한 이것을 사용하면 실현 가능하거나 쉽게 만들 수 있다면 알려주십시오.
참고
How do I change desktop background with a terminal command? - StackExchange
Mac에서 cron. - Developers.IO
Mac에서 로그인 할 때 스크립트 실행 (Automator 사용 안 함) - Qiita
bash 코딩 규칙 - Qiita
쉘 스크립트 (bash) if 문과 test 명령 ([]) 자신 메모
Reference
이 문제에 관하여(Mac OS X에서 시간대별로 배경 화면을 변경하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ezawa800/items/fc6938ed20be07dbc407
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Mac OS X에서 시간대별로 배경 화면을 변경하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ezawa800/items/fc6938ed20be07dbc407텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)