명령 줄을 사용하여 OS X에서 앱 실행


109

스크립트에서 OSX에서 앱을 시작하고 싶습니다. 명령 줄 인수를 전달해야합니다. 불행히도 open명령 줄 인수를 허용하지 않습니다.

내가 생각할 수있는 유일한 옵션은 nohup myApp > /dev/null &앱을 실행하는 스크립트와 독립적으로 존재할 수 있도록 내 앱을 실행하는 데 사용 하는 것입니다.

더 좋은 제안이 있습니까?


나는 질문을 따를 수 없습니다. "open"은 명령 줄 인수를 허용하지 않습니까? "개방"이란 무엇입니까? AppleScript가 열려 있습니까? 어떻게는 않는 nohup &문제를 해결?
S.Lott

4
man open (1)-파일 또는 앱을 실행하는 OS X 명령
Ned Deily

3
이 superuser.com에 있어야합니다
제프 미트볼 양

답변:


78

OS X 10.6에서는 open응용 프로그램에 인수를 전달할 수 있도록 명령이 향상되었습니다.

open ./AppName.app --args -AppCommandLineArg

그러나 맥 OS X의 이전 버전에 대한 응용 프로그램 번들이 명령 줄 인수를 전달하도록 설계되지 않고 있기 때문에, 기존의 메커니즘을 사용하는 것입니다 애플 이벤트 파일이 좋아하는 위해 여기에 코코아 앱 또는 위해 여기에 카본 애플리케이션을 위해. 환경 변수를 사용할 때 매개 변수를 전달하여 약간의 작업을 수행 할 수도 있습니다.


내 kludgey 접근 방식은 nohup을 사용하여 명령 줄 args로 실행 파일을 직접 호출하는 것입니다-만약 environment-vars-kludge가 덜 kludgey?
psychotik

2
아마 아닐 것입니다. 그것이 당신을 위해 작동한다면, 함께 가십시오. 더 큰 요점은 open (1)이 사용자가 Finder에서 더블 클릭 또는 "열기"를 수행 할 때 발생하는 CLI와 동일하며 이러한 메커니즘 중 어느 것도 일반적인 명령 줄 인수를 지원하지 않는다는 것입니다.
Ned Deily

+1 : Mac OS X GUI 응용 프로그램에 대해 명령 줄 인수를 사용하면 안됩니다.
S.Lott

2
명령 줄 인수, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US를 사용하지 않도록 Google에 알립니다. -force-fieldtest
Anurag Uniyal 2010

@Anurag Uniyal. "왜?" 답을 읽었습니까? "기존의 메커니즘은 Cocoa 앱의 경우 여기 또는 Carbon 앱의 경우 여기와 같은 파일에 Apple Events를 사용하는 것입니다." 이것이 바로 Mac OS X가 설계된 방식입니다. 예. Chrome은 규칙을 어 깁니다. Linux 명령 줄 유틸리티도 마찬가지입니다. 그러나로 열리는 GUI 응용 프로그램 open은 대답에서 알 수 있듯이 명령 줄에서 작동하도록 설계되지 않았습니다. "왜?" 그것이 Mac OS X의 방식이기 때문입니다.
S.Lott

105

여기 질문 에서 언급했듯이 open10.6 의 명령에는 이제 args플래그가 있으므로 다음을 호출 할 수 있습니다.

open -n ./AppName.app --args -AppCommandLineArg


필요한 방식으로 정확하게 작동합니다. 감사합니다
DTdev 2013

이것은 효과가 있었고 Chromium에 대한 zsh 별칭을 설정할 수있었습니다. 감사합니다
jamescampbell 2015 년

이 대답은 훌륭합니다. 터미널을 처음 열 때 홈 디렉토리에있는 것을 추가하고 싶었으므로이 방식으로 입력하면 Application 디렉토리로 전환 할 필요가 없습니다. 나는 글꼴을로드하지 않고 Gimp를 실행하기를 원했기 때문에 -f 스위치를 사용하여 글꼴을 생략했습니다. open -n /Applications/GIMP.app --args -f
James Toomey

32

응용 프로그램 번들 ( .app파일)은 실제로 여러 디렉토리입니다. open.app이름 을 사용하는 대신 실제로 이동하여 실제 바이너리를 시작할 수 있습니다. 예를 들면 :

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

그것은 인수를 받아 들일 수있는 실제 바이너리입니다 ( LittleSnapper'의 경우).


3
바이너리는 인수를 허용합니다. 내가 썼어. 'open'을 호출하면 인수 전달이 허용되지 않습니다. 나는 이것에 대해 꽤 확신합니다. 그리고 예, 내 스크립트는 번들을 열려고하지 않고 'open binary'를 직접 호출합니다.
psychotik

@psychotik : 그는 "오픈 바이너리"라고 부르는 것이 아닙니다. 그는 바이너리를 직접 실행하라고 말하고 있습니다.
Chuck

그것은 나를 위해 작동하지 않습니다. 바이너리를 직접 실행하면 스크립트의 하위 프로세스가되는데, 이는 확실히 원하지 않습니다. 따라서 open / nohup을 사용해야 할 필요성
psychotik

1
쉘 스크립트 인 경우 'exec'를 사용하여 스크립트 프로세스를 실제 실행 파일로 바꿉니다.
Jonathan Leffler

2
이 접근 방식에는 큰 단점이 있습니다. 번들에 사용자 지정 라이브러리 및 프레임 워크가 포함 된 경우 DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko

14

앱이 파일에서 작동해야하는 경우 (일반적으로 전달 될 것으로 예상되는 파일 :) ./myApp *.jpg, 다음과 같이 수행합니다.

open *.jpg -a myApp

이것이 바로 제가 찾던 것입니다! 내 인스턴스화, 예 : open something.py -a Eclipse.app
Eric

4

MathieuK가 제공하는 기술을 추천합니다. 제 경우에는 Chromium으로 시도해야했습니다.

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

나는 이것이 OP의 문제를 해결하지 못한다는 것을 알고 있지만, 다른 누군가의 시간을 절약하기를 바랍니다. :)


@Pacerier이 명령 끝에`&`를 추가합니다. 백그라운드에서 실행됩니다. 그런 다음 터미널 창을 닫아도 응용 프로그램은 계속 열려 있습니다.
Paul Irish

2

open또한 애플리케이션 폴더 내에서 이름 (또는 -b 플래그가있는 번들 식별자)로 앱을 여는 데 사용할 수있는 -a 플래그가 있습니다. 이것을 --args 옵션과 결합하여 원하는 결과를 얻을 수 있습니다.

open -a APP_NAME --args ARGS

팩터 2x 및 루프로 확장되어야하는 VLC 플레이어에서 비디오를 열려면 예를 들어 다음과 같이합니다.

open -a VLC --args -L --fullscreen

터미널에 명령 출력을 가져올 수 없습니다. (나는 그것을 해결하기 위해 아무것도 시도하지 않았지만)


open -a의도적으로 반복 했나요 ?? 어쨌든 open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userll나를 위해 작동하지 않습니다.
Pacerier

실례합니다, 내 구문은 어떤 이유로 완전히 꺼져 있습니다. 지금 업데이트하겠습니다.
rien333

2

각각 고유 한 프로필을 사용하는 두 개의 개별 Chrome 인스턴스를 실행하고 싶었습니다. Mac 앱을 시작하는 습관처럼 Spotlight 에서 시작할 수 있기를 원했습니다 . 즉, regChrome일반 브라우징과 altChrome특수 프로필을 사용하기 위해 두 개의 일반 Mac 응용 프로그램이 필요 했습니다. ⌘-space를 눌러 Spotlight를 불러 온 다음 'reg'또는 'alt'를 누른 다음 Enter 키를 눌러 쉽게 시작할 수 있습니다.

위의 목표를 달성하는 무차별 대입 방법은 각 이름으로 Google 크롬 응용 프로그램 번들의 복사본을 두 개 만드는 것입니다. 그러나 그것은 추악하고 업데이트를 복잡하게 만듭니다.

결국 두 개의 명령을 포함하는 두 개의 AppleScript 응용 프로그램을 사용하게되었습니다. 다음은 다음과 같습니다 altChrome.

do shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

두 번째 줄은 대체 프로필 ( --user-data-dir매개 변수)로 Chrome을 시작합니다 .

첫 번째 줄은 두 응용 프로그램에 고유 한 아이콘을 제공하려는 시도가 실패한 것입니다. 처음에는 제대로 작동하는 것처럼 보입니다. 그러나 조만간 Chrome은 아이콘 파일을 다시 읽고 두 앱 중 마지막에 시작된 앱에 해당하는 파일을 가져와 동일한 아이콘으로 두 개의 실행중인 응용 프로그램을 만듭니다. 그러나 나는 그것을 고치려고 노력하지 않았습니다. 나는 두 개의 브라우저를 별도의 데스크톱에 유지하고 그 사이를 탐색하는 것은 문제가되지 않았습니다.


2

OS X Yosemite 부터 이제 AppleScriptAutomator 를 사용 하여 복잡한 작업을 자동화 할 수 있습니다. 이제 자동화 용 JavaScript를 스크립팅 언어로 사용할 수 있습니다.

이 페이지는 bash 및 osascript 대화 형 모드를 사용하여 명령 줄에서 작성할 수 있는 좋은 예제 스크립트제공 합니다. Safari 탭이 열리고로 이동합니다 example.com.

http://developer.telerik.com/featured/javascript-os-x-automation-example/
osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.push(tab); 
window.currentTab = tab;

애플 스크립트 자동화를 사용할 수있는 앱 목록은 스크립트 편집기 / 창 / 라이브러리를 확인하십시오. Chrome을 기반으로 Vysor를 찾고 있었는데 다른 방법이 필요하다고 생각합니다.
AnneTheAgile

더 복잡한 ftw!
Pacerier

1

applescript 사용 :

tell application "Firefox" to activate

Firefox에 인수를 어떻게 전달합니까? 예 : -no-remote -P "Another Profile". 애드온 등을 개발할 때 두 개의 개별 프로필을 사용하여 두 개의 별도 Firefox 프로세스를 갖는 것이 편리합니다. 확장 프로그램을 디버깅 할 일반 프로필 및 샌드 박스.
George

나는 당신이 AppleScript 지시문을 언급하고 있다고 믿지만 질문은 명령 줄에서 여는 것에 관한 것입니다 ...
conny

0

앱의 저장소에 경로 추가를 설정하지 않는 이유는 무엇입니까? MacVim의 경우 다음을 수행했습니다.

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

별칭은 내가 시도한 또 다른 옵션입니다.

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

내보내기 PATH를 사용하여 앱의 모든 명령을 호출 할 수 있습니다. MacVim을 사용한 테스트에서 인수가 잘 통과되었습니다. 별칭은 빈에있는 각 명령의 별칭을 지정해야했습니다.

mvim README.txt
gvim Anotherfile.txt

별칭과 PATH의 힘을 즐기십시오. 그러나 OS가 업그레이드되면 변경 사항을 모니터링해야합니다.


"MacOS는 Linux 기반임을 기억하십시오". 아니요, 그렇지 않습니다. macOS와 Linux는 한 줄의 코드를 공유하지 않습니다. MacOS는 FreeBSD에 기반한 커널이있는 UNIX입니다.
Thomas

바뀔 것이다. 나는 종교 전쟁을 일으키고 싶지 않습니다. 목표는 MacOS 사용자가 활용할 수있는 몇 가지 강력한 옵션이 있음을 커뮤니티에 알리는 것이 었습니다.
zerocog

물론입니다. 문제 없습니다! :)
Thomas

0

간단합니다. 여기서 "APP"를 실행하려는 앱의 이름으로 바꿉니다.

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

나중에 감사합니다.


0

다음을 사용하여 앱을 시작할 수 있습니다 open.

open -a APP_YOU_WANT

원하는 응용 프로그램이 열립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.