Mac OS에서 명령 줄 인수로 응용 프로그램을 실행하는 방법


60

Mac의 응용 프로그램에 명령 줄 인수를 추가하는 쉬운 방법이 있습니까? 예를 들어, 키오스크 모드에서 Opera를 실행하거나 Firefox에서 다른 프로파일을 사용하려면 다음을 입력하십시오.

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

Windows에서는 단축키 속성에 인수를 추가 할 수 있지만 Mac은 단축키 자체를 사용하지 않고 응용 프로그램을 직접 실행하기 때문에 불가능합니다.

bash 또는 Applescript를 통해 응용 프로그램을 시작하면 부분적으로 작동한다는 것을 알았습니다.

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

이 실행 파일을 만들고 아이콘을 할당 할 수 있으며 이러한 의사 프로그램 중 하나를 실행할 때 응용 프로그램이 열려있는 한 터미널 창이나 Applescript 아이콘이 열려있는 것을 제외하고는 모든 것이 잘 작동합니다. 아마도 Applescript 명령을 사용하면 open이를 피할 수는 있지만 패키지로 응용 프로그램을 실행 /Applications/Firefox하지 않기 때문에 작동하지 않습니다.

그렇다면 명령 줄 인수로 응용 프로그램을 실행하는 더 좋은 방법이 있습니까? 그렇지 않은 경우 응용 프로그램이 열려있는 동안 영구 터미널 세션 또는 Applescript 아이콘이 계속 열려 있지 않도록하는 방법이 있습니까?

편집하다

Mozilla Wiki 페이지 에 따르면 스크립트를 사용하여 인수로 응용 프로그램을 실행하는 것이 가장 좋습니다. &스크립트 끝에 a 를 추가 하면 영구 터미널 창이 종료됩니다. 유일한 성가신 것은 죽은 로그 아웃 된 터미널 창을 여는 것입니다 (영구적 인 것보다 낫지 만 여전히 ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &

2
나는 아직도 이것에 대한 더 나은 답변을 기대하고 있습니다 ...
cregox

&여전히 작업 이 터미널에 속해 있는 상태에서 작업을 실행할 때 작업을 실행 한 disown %/Applications/Firefox.app/Contents/MacOS/firefox 후 줄을 추가하여 문제를 해결할 수 있습니다 . 그러면 AppleScript를 사용하여 터미널을 안전하게 닫을 수 있습니다.
ocodo

Daniel의 답변을 찾으십시오-오늘날 가장 완벽하고 완벽합니다 (OSX 10.6.2 +).
cregox

답변:


17

가장 좋은 해결책은 다음과 같습니다.

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

그리고 응용 프로그램으로 저장하십시오 .

첫 번째 부분에 어떤 인수를 사용하든 응용 프로그램을 넣을 수 있습니다. &스크립트 + .app라는 이름을 가진 것을 죽일 필요가 있는 부분 . 도크에서 스크립트 앱이 깜빡 인 다음 사라집니다.

참고 : 스크립트는 스크립트 편집기에서 실행할 때 생성 한 스크립트 응용 프로그램에서 실행할 때만 제대로 작동하지 않습니다.


거의 작동합니다. killall을 실행할 때까지 Firefox 인스턴스가 완료되기를 기다리고 있으므로 Firefox를 닫을 때 디버거를 호출하고 스크립트 앱은 여전히 ​​사라지지 않습니다. 흠 ...
앤드류

이상 하네. 앱으로 저장 한 다음 앱을 두 번 클릭합니까? 스크립트 편집기에서 실행할 때는 작동하지 않습니다.
MJeffryes

또한 & 앞에 줄 바꿈을 넣은 것을 알 수 있습니다. 줄 바꿈이 있으면 제거하십시오
MJeffryes

Snow Leopard 10.6.x에서는 & killall이 필요하지 않습니다. 그러나 앱이 실행 되 자마자 스스로 앱을 죽일 수있는 방법을 찾지 못했습니다.
cregox

1
@Pacerier이 답변의 날짜를 확인하십시오.
MJeffryes

28

OS X 10.6.2부터 open 명령은 --args 플래그를 통해 열리는 응용 프로그램에 인수를 전달할 수 있습니다. 사용하는 AppleScript는 다음과 같습니다.

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

원하는 모든 동작을 제공해야합니다.


"남자 오픈"이 있습니다! 매력처럼 일했다. --args 플래그와 인수.
Michael Dimmitt

1
--argsChrome으로 시도했지만 작동하지 않습니다. 첫 번째 인스턴스 에서만 작동 합니다 . 두 개를 --user-data-dir동시에 실행하려고 하면 할 수 없지만 open이전 /applications...방법으로 실행해야합니다 . 왜 섹스가 --args 작동 하지 않는지 아십니까?
Pacerier

1
@Pacerier, "open -n"
Simon Wright

이에 추가하기 위해 스크립트 편집기에서 스크립트를 작성한 다음 응용 프로그램으로 저장할 수 있습니다.
Kevin C.

11

Automator를 열고 단일 Run Shell Script 작업으로 응용 프로그램 을 만듭니다 .

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

이 응용 프로그램은 Firefox를 시작하고 즉시 종료하고 Firefox 만 실행합니다.


또는 다음 AppleScript 코드와 함께 AppleScript 편집기 를 사용하여 응용 프로그램을 생성하십시오 .

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

둘 다 잘 작동하고 터미널이나 스크립트 응용 프로그램을 1 초 이상 계속 실행하지 않습니다. Automator를 사용 하면 원하는 경우 서비스를 작성할 수도 있습니다 .


1
open --argsBob이 이미 언급했듯이 10.6.2에서 구현되었음을 명심하십시오 .
cregox

사용 : open eclipse.app -n두 번째 Eclipse 작업 공간을 엽니 다. 매우 편리합니다. 감사!
jonalv

MacOS 10.14의 "쉘 스크립트 실행"조치로 Automator에서 작동하지 못했습니다. 그래도 AppleScript로 성공했습니다.
Kevin C.

8

이것은 오래된 토론이지만 여전히 Google 검색에 표시되므로 몇 ¢을 추가 할 것이라고 생각했습니다.

실행 파일의 절대 경로보다는 "번들 식별자"를 사용하는 것이 좋습니다.

open -b com.google.Chrome --args --profile-directory="Profile 1"

또는 Apple Script에서 :

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

내가 아직 이해하지 못한 것은 첫 번째 인스턴스가 이미 열려 있으면 다른 프로파일로 새 인스턴스 / 창을 여는 방법입니다. (위에서 AppleScript를 실행하고 "Profile 2"가있는 다른 스크립트를 실행하면 Chrome에서 여전히 "Profile 1"로 다른 창을 엽니 다). :(


-b는 기능적으로 -a와 동일합니까? 그것들은 어떻게 다릅니 까?
Pacerier

7

이 시나리오에서 killall (또는 유사한)을 사용하여 부모 AppleScript 응용 프로그램 프로세스 (“애플릿”)를 종료 할 필요는 없습니다 (다른 답변에서 제안한 바와 같이 ). killall에 지정된 이름 / 패턴 이 부모 애플릿 프로세스 (예 : "applet"를 패턴으로 사용하는 경우)와 동시에 다른 애플릿 프로세스 이상과 일치 하는 경우 부작용이있을 수 있습니다 .

이와 같은 kill $PPID것이 더 합리적 일 수 있지만, AppleScript 응용 프로그램의 애플릿이 항상 do shell script로 시작된 쉘의 직계 부모라고 가정하고 싶지 않을 수 있습니다 . 운 좋게도 필요한 작업을 수행하는 데 가장 합리적인 방법이 있습니다.

TN2065 ( "나는 백그라운드 서버 프로세스를 시작하려면?, 나는 쉘 스크립트 명령이 완료 될 때까지 기다리지 않는다 어떻게해야합니까"에서) 적절한 방법은 표준 출력 및 표준 오류를 리디렉션 쉘이 백그라운드에서 프로그램을 실행하는 것입니다 .

사용 스크립트 편집기를 애플 스크립트 응용 프로그램으로 다음 프로그램을 저장합니다 :

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

(기능 줄 바꿈은 "좁은"을 유지하기 위해 추가하며 삭제 ¬하고 \\당신이 좋아하는 경우에 하나의 긴 줄에 모두 넣어)

Firefox 를 시작할 수있을만큼 오래 실행 되며 Firefox가 계속 실행 되는 동안 완전히 종료됩니다 .

쉘 스크립트 는 직계 자식 (쉘)이 종료 될 때까지 대기 할뿐만 아니라 쉘의 stdout 및 stderr가 닫히기 위해 작성하는 파이프의 쓰기 가능한 끝 (모든 인스턴스)을 대기하기 때문에 경로 재 지정이 필요합니다. . 쉘의 stdout과 stderr ( 쉘 스크립트 파이프 수행)은 경로 재 지정없이 실행되는 프로그램에 의해 상속됩니다 &. 리다이렉션은 쉘이 파이프의 쓰기 가능한 끝을 유지하는 마지막 쉘임을 보장합니다. 따라서 쉘 스크립트 가 종료되면 바로 쉘 스크립트 가 리턴되어 AppleScript 응용 프로그램 자체가 종료됩니다 ( do 쉘 스크립트 가 AppleScript 프로그램의 마지막 표현식이므로).

open (실제 LaunchServices)은 결과 프로그램을 백그라운드 화하고 stdout 및 stderr을 다른 곳으로 보내는 것과 동등한 작업을 수행하므로 open inside 를 사용하는 다른 답변 은 쉘 스크립트 작업을 수행합니다.


이것은 매우 흥미 롭습니다. 10.6.2 이전에 작동하는지 궁금합니다 ...하지만 여전히 open --args깔끔하게 사용한다고 생각 합니다. 그중 하나를 사용하는 데 단점이 있습니까?
cregox

1
이 방법이 10.4에서 작동한다는 것을 알고 있습니다. 필자 는 쉘 스크립트 가 항상 다음과 같이 작동 한다는 사실을 알고 있습니다 ( Mac OS X 10.1과 함께 제공되는 AppleScript 1.7표준 추가 OSAX에 추가 되었습니다 ). 10.6을 기꺼이 생각한다면 괜찮을 것입니다. open --args
Chris Johnsen

@ChrisJohnsen, 링크 다운 ........
Pacerier

4

애플 스크립트

do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

거기에 두 가지 점이 있습니다.

  1. 백 슬래시로 이스케이프 처리 된 공간은 백 슬래시로 이스케이프 처리됩니다.
  2. killall 애플릿 은 다른 애플릿이 실행 중일 수 있으므로 문제를 일으킬 수 있습니다.
  3. 프로그램으로 저장

그러나 10.6.5에서 잘 작동합니다.


applet을 참고하여?
Pacerier

3

다음은 .app 자체에 대한 명령 행 인수를 지정할 수있게합니다.

.app 번들을 마우스 오른쪽 단추로 클릭하고 "패키지 내용 표시"를 선택하고 Info.plist로 이동하여 두 번 클릭 한 다음 Args 키를 찾아서 편집하십시오.

현재로서는 OS X 컴퓨터가 없어서 별명으로도 할 수 있는지 여부를 확인할 수 없습니다 (원래의 .app 인수를 사용하지 않고 기타로 유지하려는 경우).


불행히도 plist에는 args 키가 없습니다. 모질라에 따르면, 스크립트 -wiki.mozilla.org/MailNews:Logging#Mac
Andrew

Info.plist와 같은 패키지 내용을 변경하면 코드 서명에 문제가 발생할 수 있습니다. bridge.grumpy-troll.org/2011/01/…
drevicko

2

응용 프로그램을 AppleScript 런처 안에 넣으십시오.

단계는 다음과 같습니다.

  1. 다음 내용으로 AppleScript를 생성하고 응용 프로그램으로 저장하십시오 (이 예제에서는 "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Finder에서 해당 앱으로 이동하여 마우스 오른쪽 버튼으로 클릭하고 패키지 내용을 표시하십시오.

  3. 응용 프로그램을 패키지 내용의 루트에 두십시오. (이 예에서는 "Firefox 3.app"입니다)

    결과 : / Applications / Firefox 3 launcher.app/Firefox 3.app

  4. 이제 응용 프로그램 실행기를 열 수 있습니다.

노트:

  • 랩핑 된 애플리케이션의 자동 업데이트는 대부분의 경우 작동합니다.
  • 런처로 드래그 앤 드롭하면 래핑 된 응용 프로그램으로 자동 리디렉션됩니다 (약간의 스크립팅 사용).
  • 랩핑 된 애플리케이션이 시작된 후 실행기가 자동으로 종료됩니다.
  • 이 방법의 장점은 랩핑 된 응용 프로그램을 직접 열 위험이 거의 없다는 것입니다.

1

왜 사용하지 않습니까?

#!/bin/sh
open /Applications/Firefox.app

간단하지만 작동합니다.


2
그렇게하면 터미널이 열립니다.
MJeffryes

0

open명령에는 선택적 --args인수가 있으며 값은 열린 응용 프로그램에 인수로 전달됩니다. 예를 들면 다음과 같습니다.

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