macOS: Shell script 로 macOS application 만들기

역시, 뒤지고 파니까 답은 나온다.
이 글에서는, 기존에 있는 Shell script 를 사용해서 macOS 고유 Application 을 만드는 법에 대해 알아본다. Shell script 는 어떤 내용이라도 괜찮겠지만, 여기서는 이전에 만든 Wine Wrapper 를 사용해보기로 한다.


  • Automator 를 실행하고, ‘응용 프로그램’을 선택한다.
  • 보관함/유틸리티에서 셸 스크립트 실행을 선택한다.
  • 셸은 적절하게 선택(/bin/sh 면 무난)하고, 통과 입력은 반드시 ‘변수’로 지정한다.
대장정(?)의 첫걸음

‘변수’를 선택하면 기본으로 for 文이 입력되는데, 여기선 무시해도 된다. 지우거나, 혹시라도 나중에 쓸 일을 대비한다면 주석처리한다.

이 입력창에 직접 스크립트를 입력해도 된다.
그러나 이미 스크립트가 있다면, 굳이 입력할 필요없이 그냥 스크립트 이름을 경로와 함께 넣어주면 된다.
홈디렉토리에 있는 스크립트라면, 나중을 위해서, $HOME 등을 사용하는 편이 좋다. 이렇게 생성된 xxx.app 을 보관했다가 다른 macOS 에서 사용한다든가할 때, 경로가 일반화 되어 있으면 신경쓸 문제가 하나 줄어들기 때문이다.

실행 명령은 이런 식이다.

$HOME/bin/wine_mp3tag_4Finder "$@"

저장 시에, 디렉토리는 /Applications 또는 ~/Applications 로 지정한다. 그래야 런처에서 검색이 되고 실행할 수 있다.

wine_mp3tag_4Finder 의 내용은 다음과 같다.

#!/bin/sh

# Wine 실행경로를 PATH 에 추가
export PATH="/Applications/Wine Stable.app/Contents/Resources/wine/bin":$PATH

tempF="$1"
folderw=$(winepath -w "$tempF" 2> /dev/null)
USER_HOME=$HOME/'.wine'

export WINEPREFIX="$USER_HOME"
export WINEARCH="win32"
export LC_ALL="ko_KR.UTF-8"

wine "C:\Program Files\Mp3tag\Mp3tag.exe" "/fp:$folderw" &>/dev/null &
exit 0

이전 글에서, &>/dev/null & 에 대해 언급했었다. 이 부분이 빠지면, 스크립트를 실행했을 때 macOS 메뉴 막대 부분에 움직이는 기어(Gear) 모양 아이콘이 생긴다. 생기는 것까진 좋은데, 이게 프로그램이 종료될 때까지 계속 돌아가고 있어서 조금 눈에 거슬린다.
이 기어를 없애기 위해 저런 작업이 필요하다.

&> 로, 실행/오류 결과를 모두 null 로 보내고, & 로 키보드 분리를 해준다.
이 기막힌(?) 방법은 StackExchange 에서 알아냈다. cYrus 님 고맙습니다!

또는 다른 방법(killall ScriptMonitor)도 있긴 한데, 위 방법이 훨씬 간편하다.


그런데, 여기에 세가지 문제가 있다. 하나는 간단하고, 두개는 조금 복잡하다.
첫번째는 아이콘 문제다. 기본 아이콘이 Automator(로봇?) 모양이라, 썩 만족스럽질 못하다. 인터넷에서 적당한 아이콘을 찾든, MS 윈도우 아이콘을 추출하든 해서 아이콘을 구한 다음, 바꿔치기 한다.

  • 위에서 저장한 프로그램을 찾고, 우클릭 하여 ‘정보 가져오기’를 선택.
  • 맘에 드는 아이콘을 가진 프로그램을 찾아, 똑같이 ‘정보 가져오기’를 택함.
  • 화면 윗부분의 아이콘을 클릭하여 선택하고, CMD + C 로 복사. 또는, 맘에 드는 아이콘을 찾아 (클립보드로) 복사.
  • 내가 만든 프로그램의 아이콘을 선택하고, CMD + V 로 붙여넣기.

첫번째는 이렇게 해결이 되는데.. 두번째부터 조금 문제다.

내가 이렇게해서 만든 프로그램은 Mp3Tag 이다. 이걸 .mp3 와 .flac 에 연관을 시키고 싶었는데, 잘 되지 않았다.
mp3 파일을 우클릭하고 ‘다음으로 열기’ 메뉴를 통해, 이 프로그램을 선택하고, ‘항상 다음으로 열기’를 통해서, ‘기본 프로그램’으로 만들어줄 수는 있다.
다만, 이렇게 되면 더블클릭했을 때 늘 Mp3Tag 이 열리는데, 내가 원하는 건 이런게 아니다.

이렇게, ‘다음으로 열기 메뉴’에 추가하고 싶다.

부 메뉴 중에 하나로 추가하고 싶은데, 어떻게 해야 하나?
물론, 성공했으니 위처럼 화면을 찍을 수 있었겠지.

이를 위해선, xxx.app/Contents/Info.plist 를 편집해야 한다. 이 파일은 이진파일이 아닌 일반 텍스트 파일로, 아무 편집기로나 열어서 고칠 수 있다.

파일을 열고, 다음 항목을 찾는다.

<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeExtensions</key>
			<array>
				<string>*</string>
			</array>
			<key>CFBundleTypeName</key>
			<string>Automator workflow file</string>
			<key>CFBundleTypeOSTypes</key>
			<array>
				<string>****</string>
			</array>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
		</dict>

윗 부분을 지워도 되는지, 남겨야 되는지는 모르겠다. 잘 모르니 그냥 남겨놓기로 하고, 아래에 다음 내용을 덧붙인다.

<dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                    <string>mp3</string>
            </array>
            <key>CFBundleTypeIconFile</key>
            <string>mp3.icns</string>
            <key>CFBundleTypeName</key>
            <string>MP3 Audio File</string>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
            <key>LSTypeIsPackage</key>
            <false/>
</dict>

이렇게 하고 나서 중요한 작업이 하나 더 남았다.
Finder 에서 이 앱의 위치를 찾아서, 다른 디렉토리로 이동을 해야만 한다. 그래야 바뀐 정보가 등록된다고 한다. 아무 위치로나 이동했다가, 다시 원 위치로 복구해주는게 좋겠다.

그런데.. 이렇게 해도 ‘다음으로 열기’에 등록이 되지 않는다면, 등록을 원하는 파일(확장자)을 우클릭한 후, ‘정보 가져오기’를 선택한다.
여기에서, ‘다음으로 열기’로 간 뒤 해당 프로그램을 추가한 뒤, 일단, ‘모두 변경’을 통해 기본값으로 만들어 준다.
그 다음, 다시 원래 프로그램으로 기본값을 되돌리면…
돌고 돌아서 원하는 결과를 얻을 수 있다.

Flac 까지 등록하고 싶다면, 저 dict 영역을 복사하여 넣고, mp3 만 flac 으로 바꿔준다.

마지막 세번째, 왜 그런지 모르지만, Automator 에서 응용 프로그램을 만들면 버전이 1.03 인가로 나온다. 그대로 놔둬도 전혀 문제는 없지만, 이왕 만드는 거..
같은 Info.plist 를 열고, 다음 항목을 찾아서 제대로 넣어준다.

<key>CFBundleShortVersionString</key>
	<string>2.54</string>

이젠, 어떤 프로그램이든(Wine 이든, Shell script 등), 마치 macOS App. 처럼 사용할 수 있다.

나날이 늘어만 가는.. (잔머리?)


이걸 Shell script 말고, Applescript 를 이용해서도 할 수 있다.
그런데, 이러려면, 디렉토리를 넘기는 방식에 조금 문제가 있을 수 있다.
Applescript 를 사용하면 ‘input’ 이라는 매개변수를 통해 디렉토리가 넘어가는데, 이 형식이 일반(Posix)방식이 아니고, 애플에서 쓰는 방식이라, 받는 프로그램도 이 형식을 지원해야만 한다.

따라서, 그냥 이런 식으로 스스로 ‘만들어’ 쓰기엔 Shell script 를 사용하는 편이 나을 듯 하다.

안녕하세요. 글 남겨주셔서 고맙습니다.