터미널 창이 나타나지 않고 OS X에서 쉘 스크립트를 실행 하시겠습니까?


23

BetterTouchTool과 약간의 AppleScript 마법으로 할 수있는 특정 iTerm 세션을 여는 몇 가지 키보드 단축키를 설정하려고합니다. 문제는 OS X이 GUI를 통해 실행하는 쉘 스크립트 (예 : Finder 또는 BetterTouchTool의 키보드 단축키)에 대한 터미널 창을 열어야한다는 것입니다. 다른 터미널에서 직접 스크립트를 실행하면 터미널 창이 나타나지 않습니다.

내가 찾은 해결 방법은 스크립트를 .app 디렉토리에 래핑하여 불필요한 터미널 창의 문제를 해결하지만 다른 문제가 있습니다 (예 : OS X는 결과 iTerm 창을 별도의 앱으로 취급하여 도크를 어지럽히는 것처럼 보입니다) ). (편집 :이 동작은 실제로 내 스크립트의 버그로 인해 발생했습니다 (아래 참조))

또한 공간 설정에서 다른 가상 데스크톱에 터미널 앱을 할당하여 보지 못했지만 스크립트를 실행하기 전에 먼저 해당 데스크톱으로 전환합니다.

이 동작을 완전히 비활성화하는 방법이 있습니까? 스크립트가 완료된 후 창을 닫는 터미널 환경 설정에서 이미 설정을 찾았지만 터미널 창을 잠시 동안 팝업하는 것은 여전히 ​​성가신 일입니다.


죄송합니다. 잘 모르겠습니다. 이 쉘 스크립트로 무엇을하고 싶습니까? 쉘 스크립트를 통해 iTerm을 열겠습니까? 당신은 독점적으로 Terminal.app에 대해 이야기하거나 질문에서 iTerm과 "Terminal"을 혼합하고 있습니까? 당신은 당신이 실행하려고하는 예를 게시 할 수 있습니까?
slhck

나는 일반 쉘을 시작하고, Rails 콘솔을 열고, Rails 로그 등을 표시하기 위해 여러 iTerm 세션을 설정했습니다. iTerm을 독점적으로 사용하고 있으며, 어리석은 이유로 OS X에 의해 터미널이 자동으로 열립니다. 그러나 어쨌든 번들 접근 방식이 올바르게 작동하는 솔루션을 찾았습니다 (편집 된 질문 참조).
toupeira

내가 참조! 아래 버튼을 사용하여 자신의 질문에 대답하고 수행 한 작업이나 문제를 해결 한 방법을 알려 주면 정말 좋을 것입니다. 질문에 몇 가지 예를 게시 한 다음 간단한 답변을 추가하십시오. 이런 식으로 누군가 내 게시물을 우연히 발견하면 게시물에서 무언가를 배울 수 있습니다.
slhck

글쎄, 여전히 실제 질문에 대한 대답이 없습니다 (즉, .app 래퍼를 사용하지 않고 터미널을 완전히 피하는 방법). 누군가 누군가 나를 밝게 할 수 있도록 열어 두는 것이 좋습니다.
toupeira

1
여전히 혼란 스러워요. 당신은 하지 않는 자동화에 의해 생성 된 .APP를 통해이를 실행하려면?
slhck

답변:


21

Automator를 열고 Application을 선택한 다음 Run Shell Script 작업을 추가하고 따옴표 사이에 Shell 명령을 넣습니다 (파일이 있으면 끌어서 놓기 만하면 됨).

그것을 재생하는 것 외에도, 이제는 (어디서나 앱으로) 저장 하고 아이콘을 설정할 수도 있습니다.


전체 화면 앱에서 이런 식으로 명령을 실행하려고했지만 항상 백그라운드에서 열었습니다. 을 추가하여 쉘에서 명령을 비 차단 방식으로 배경 화 &한 다음 AppleScript를 호출하여 (내 경우에는 mplayer) 앱 을 맨 앞에 가져옵니다 . mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
Lenar Hoyt

멋진 핵 @mcb. 그러나 나는 왜 그런지 모르겠다. 일반적으로 터미널 창은 기본 창인 다른 창을 열기 때문에 숨기려고합니다. mplayer의 첫 번째 터미널 창이 필요하다면 다른 창이 열리지 않는 이유는 무엇입니까? 왜 처음에 숨길까요?
cregox

mplayer슬라이드 쇼 내에서 비디오를 재생하는 데 사용 하고 있습니다 (Skim). Skim이 전체 화면으로 설정된 경우 플레이어가 백그라운드에서 유지되는 버그가 있지만이 버그가 Skim 또는 모든 전체 화면 응용 프로그램과 관련이 있는지 여부는 확실하지 않으므로 여기에 솔루션을 게시 할 것이라고 생각했습니다.
Lenar Hoyt

6

다음은 노력이 거의없는 빠르고 더러운 예입니다 ( "myapp"라는 앱의 경우).

  1. 부분 애플리케이션 계층 구조를 작성하십시오.

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. 스크립트의 첫 번째 줄에 필요한 프로그램의 전체 경로가 있는지 확인하십시오 (예 :

    #!/bin/bash
    
  3. 쉘 스크립트 이름을 "myapp"(따옴표없이, 확장명없이)로 지정하고 실행 권한을 부여한 다음 MacOS 하위 디렉토리에 넣으십시오. 실행 권한을 부여하려면 다음을 수행하십시오.

    chmod ugo+x myapp
    
  4. Contents 서브 디렉토리로 이동하여 다음 문자열을 포함하는 PkgInfo 파일을 작성하십시오. APPL ???? [문자열 끝에 줄 종결자가 없습니다!] cat (1) 유틸리티를 사용하여 파일을 만듭니다.

    cat > PkgInfo
    APPL????
    

    문자열을 입력 한 후 (return을 누르지 마십시오!) 두 개의 control-D를 입력하면
    줄 종결자가없는 파일 이 닫히고 셸 프롬프트로 돌아갑니다.

  5. 파인더에서 새로운 "앱"을 두 번 클릭하십시오. 창없이 실행됩니다.


10.13.6에서는 작동하지 않습니다. "이 유형의 Mac에서는 지원되지 않기 때문에"LoginSessionTimeLimit.app "응용 프로그램을 열 수 없습니다"라는 오류 메시지가 표시됩니다.
Douglas는

1
나를 위해 모하비 (10.14.3)에서 일했습니다. 나는이 접근법을 정말로 좋아했다. 감사.
loco.loop

10.13.6에서 나를 위해 일했습니다. @Douglas Held는 "수동으로"스크립트를 터미널에서 실행 해보십시오. 아마도 그것은 오류없이 종료되어 당신을 위해 작동하지 않습니다 ...
marekful

큰! Mojave 10.14.6에서 작업 테스트
니콜라 Mingotti

4

쉘 스크립트 및 기타 해석 된 스크립트에서 Mac OS X 응용 프로그램을 생성 하는 Platypus 를 확인하고 싶을 수도 있습니다 .


3

다음은 Alfred 와 같은 멋진 응용 프로그램 시작 프로그램을위한 작은 해결 방법 입니다. 나는 매일 그것을 사용하고 Powershell을 구입하여 자동 쉘 스크립트 를 실행할 수 있습니다 .

여기에 이미지 설명을 입력하십시오

이들은 실행될 때 터미널을 열지 않으며 키워드 순서에 바인딩 될 수 있습니다. 매개 변수를 포함 할 수 있으며 추가 옵션이 있습니다.

여기에 이미지 설명을 입력하십시오

작은 스 니펫에 이것을 사용하며 매우 유연합니다.


Alfred 2에서는 더 이상 사용할 수 없습니다. 대신 그림과 같이 "스크립트 실행"을 만드십시오 .
Dave Newton

1

키를 추가 LSUIElement하고 앱 1에서 키 를 설정하면 Info.plistDock에 아이콘이 생성되지 않습니다.

다음은 Info.plist작은 쉘 스크립트 앱입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>

고마워, 그러나 이것은 효과가없는 것 같습니다. 또한 touch최신 버전이 사용되도록 번들을 사용해 보았습니다 . 항상 별도의 응용 프로그램 인스턴스를 생성합니다 것 때문에 어쨌든, 나는 번들 방식처럼 정말 할
toupeira

나를 위해 터치도 도움이되지 않았습니다 (LSUIElement를 끄려고 시도했습니다). 다른 종류의 캐싱이 있지만 압축 및 추출 응용 프로그램이 도움이되었습니다. 번들 접근 방식이 마음에 들지 않습니까? 또한 applescript를 사용하고 그냥 실행할 수 있습니다 do shell script "say 'arsti'". 단말기 창이 열리지 않습니다.
tig

좋아, 나는 바보 일 뿐이다 .-) 앱이 이미 AppleScript로 실행되고 있는지 확인하는 신뢰할 수있는 방법을 찾을 수 없었기 때문에을 호출 pgrep하고 관련 코드를 직접 전달 하는 일반 bash 스크립트를 사용했습니다. osascript(AppleScript 인터프리터). 문제는 pgrepHomebrew에서 왔으며 기본값이 아닙니다 $PATH. 따라서 스크립트는 이미 실행 중이더라도 항상 새 iTerm 인스턴스를 시작했습니다. pgrep스크립트에 전체 경로를 추가 한 후 번들 접근 방식이 결국 제대로 작동하는 것 같습니다. 따라서 나는 지금 행복하다고 생각합니다. ;-)
toupeira

이 답변을 위의 @JeffB의 답변과 @ tig 's Info.plist의 단순화 된 버전 ( CFBundleExecutableCFBundleIconFile키를 제거했습니다 ) 과 결합 하면 완벽하게 작동합니다.
Dave Land

0

다음은 약간의 해결 방법입니다.

쉘 스크립트를 호출하는 애플 스크립트를 컴파일하십시오. :)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

이 애플 스크립트 스 니펫 osacompile을 컴파일합니다 'do shell script "XXX"'. 쉘 스크립트는 XXX입니다.

인용문을 조심하십시오. 쉘 스크립트는 여전히 컴파일하는 데 사용하는 쉘을 지나치려면 올바르게 인용해야합니다.

그러나 이것은 아무 문제없이 BetterTouchTool에서 실행할 수 있습니다.


0

다른 가능한 운동이 있습니다. 자동화 워크 플로우에서 쉘 스크립트를 보호하십시오. 실행 된 워크 플로우를 호출하십시오. 코드는 다음과 같습니다

/usr/bin/automator /path/to/the/file.workflow

이렇게하면 프로그램이 시작되거나 메뉴 표시 줄에 나타나지 않으며 Platypus 앱보다 자동으로 표시되지 않습니다.

쉘 스크립트를 실행하는 더 좋은 방법은 직접 시작하는 것입니다.

/bin/bash /path/to/shellScript.command

백그라운드에서 명령을 매우 자동으로 실행합니다.

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