web-dev-qa-db-ja.com

指定したコマンド(およびカスタムカラー)を使用して、プログラムでTerminal.appを起動します。

次のように、xtermをコマンドライン(またはシステムコールを介したプログラム)から起動できます。

/usr/X11/bin/xterm -fg SkyBlue -bg black -e myscript

これは、青いテキストと黒い背景でxtermを起動し、その中で任意のスクリプトを実行します。

私の質問:Terminal.appで同等のことをするにはどうすればよいですか?

27
dreeves

ターミナルプロファイルの1つに必要な色がすでにあると仮定して、これが私が思いついたものです( Juhaの回答 および このServerfaultの回答 からの助けを借りて)。


更新:

振り返ってみると、このechoビジネスは複雑すぎると思います。 osascriptを使用して、実行可能なAppleScriptファイルをシバン行で作成できることがわかります。

#!/usr/bin/osascript                                                                            

on run argv                                                                                     
  if length of argv is equal to 0                                                               
    set command to ""                                                                           
  else                                                                                          
    set command to item 1 of argv                                                               
  end if                                                                                        

  if length of argv is greater than 1                                                           
    set profile to item 2 of argv                                                               
    runWithProfile(command, profile)                                                            
  else                                                                                          
    runSimple(command)                                                                          
  end if                                                                                        
end run                                                                                         

on runSimple(command)                                                                           
  tell application "Terminal"                                                                   
    activate                                                                                    
    set newTab to do script(command)                                                            
  end tell                                                                                      
  return newTab                                                                                 
end runSimple                                                                                   

on runWithProfile(command, profile)                                                             
  set newTab to runSimple(command)                                                              
  tell application "Terminal" to set current settings of newTab to (first settings set whose name is profile)                                                                                      
end runWithProfile

それをterm.scptとして保存し、chmod +xで実行可能にして、以下と同じように使用します。 term.scpt "emacs -nw" "Red Sands"


元の答え:

以下のスクリプトをterm.sh...として保存するとします。

#!/bin/sh

echo '
on run argv
  if length of argv is equal to 0
    set command to ""
  else
    set command to item 1 of argv
  end if

  if length of argv is greater than 1
    set profile to item 2 of argv
    runWithProfile(command, profile)
  else
    runSimple(command)
  end if
end run

on runSimple(command)
  tell application "Terminal"
    activate
    set newTab to do script(command)
  end tell
  return newTab
end runSimple

on runWithProfile(command, profile)
  set newTab to runSimple(command)
  tell application "Terminal" to set current settings of newTab to (first settings set whose name is profile)
end runWithProfile
' | osascript - "$@" > /dev/null

...次のように呼び出すことができます。

  • term.sh
    • 新しいターミナルウィンドウを開きます。特別なものはありません。
  • term.sh COMMAND
    • 新しいターミナルウィンドウを開き、指定されたコマンドを実行します。引数を持つコマンドは、引用符で囲むことができます。 term.sh "emacs -nw"新しい端末を開いて(ウィンドウ化されていない)emacsを実行するには
  • term.sh COMMAND PROFILE
    • 新しいターミナルウィンドウを開き、指定したコマンドを実行して、指定したプロファイルに設定します。名前にスペースが含まれるプロファイルは、引用符で囲むことができます。 term.sh "emacs -nw" "Red Sands"新しいターミナルを開き、Red Sandsプロファイルで(ウィンドウ化されていない)emacsを実行します。

不正なコマンド名で呼び出した場合でも、ウィンドウが開いてプロファイルが設定されますが、新しいウィンドウにbashのエラーメッセージが表示されます。

不正なプロファイル名でそれを呼び出すと、ウィンドウは開き、コマンドは引き続き実行されますが、ウィンドウはデフォルトのプロファイルのままであり、次の行に沿って(どこで起動したかにかかわらずstderrに)エラーメッセージが表示されます。

525:601:実行エラー:端末でエラーが発生しました:名前が「elvis」である設定セット1を取得できません。インデックスが無効です。 (-1719)

呼び出しは少しハックで、時間をかけてgetoptを学ぶと改善される可能性があります(たとえば、term.sh -p profile -e commandのようなものがより適切であり、たとえば、簡単に新しいコマンドを呼び出さずに、指定されたプロファイルの端末)。そして、複雑な引用でそれを台無しにする方法があったとしても、私は驚かないでしょう。しかし、ほとんどの目的で機能します。

13
David Moles

バンドルIDでアプリを開き、他のパラメーターを指定することもできます。

現在のディレクトリに実行可能なスクリプトtest.shがある場合、次のコマンドでTerminal.appが開き、実行されます。

 open -b com.Apple.terminal test.sh 

私が見つけられる唯一の欠点は、ターミナルが現在の環境を継承していないように見えるため、実行するスクリプトにパラメーターを渡す別の方法を準備する必要があることです。パラメータを埋め込むためにその場でスクリプトを構築することは、1つのアプローチになると思います(もちろん、セキュリティへの影響を考慮に入れて...)

22
Sam Deane

ほとんどすべて(すべて?)のosxプログラムは、次を使用してコマンドラインから起動できます。

appName.app/Contents/MacOS/command

端末の場合、コマンドは次のとおりです。

/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal

オートコンプリート(タブ)またはlsを使用して、正しいファイル名を見つけることができます。 「.app」は基本的にフォルダです。

色を変更してスクリプトを実行するには...ターミナルは引数を受け付けないため( "Terminal myScript.sh"はmyScriptを起動しないため)、シェルスクリプトでは実行できないと思います。これはiTermで機能します。

回避策は、AppleScript(シェルスクリプトでラップ)を使用することです。

   #!/bin/sh
   osascript -e '
     tell application "Terminal"
       activate
       tell window 1
          do script "sleep 5; exit"
          set background color to {0, 11111, 11111}
          set win_id to id
       end tell

       set w_ids to (id of every window)

       repeat while w_ids contains win_id
         delay 1
         set w_ids to (id of every window)
       end repeat
    end tell'

これで、xtermの例とまったく同じように動作するはずです。欠点は、ウィンドウIDの継続的なポーリングです(これはプログラミングが不適切です)。

編集:もう少しエレガントなAppleScriptは、ターミナルの「ビジー」プロパティを使用します。 (ターミナルだけでなく)一般的なプログラムで機能するように、元のコードはそのままにします。

tell application "Terminal"
    tell window 1
        do script "sleep 2"
        set background color to {0, 11111, 11111}
        repeat while busy
            delay 1
        end repeat
        close
    end tell
end tell

また、完全に正しいプログラムについては、端末が実行されているかどうかを確認する必要があります。開かれるウィンドウの数に影響します。したがって、これを最初に実行する必要があります(これも厄介なハックです。後でworkingソリューションを見つけたときに編集します)。

tell application "System Events"
    if (count (processes whose name is "Terminal")) is 0 then
        tell application "Terminal"
            tell window 1
                close
            end tell
        end tell
    end if
end tell

br、
ジュハ

13
Juha

また、ターミナルGUIに移動し、オプションを完全に設定して「.terminal」ファイルにエクスポートしたり、構成をウィンドウグループにグループ化してターミナルファイル「myGroup.terminal」にエクスポートしたりすることもできます。 。その後

myGroup.terminalを開きます

すべての設定と起動コマンドが構成された状態で、ターミナルが一度に開きます。

4
jerseyboy

上記の@ david-molesからの回答は機能しますが、termが起動された現在の作業ディレクトリではなく、〜でターミナルとコマンドを実行します。このバリエーションは、cdコマンドを追加します。

#!/usr/bin/env bash
# based on answer by @david-moles in 
# https://stackoverflow.com/questions/4404242/programmatically-launch-terminal-app-with-a-specified-command-and-custom-colors
echo "
on run argv
  if length of argv is equal to 0
    set command to \"\"
  else
    set command to item 1 of argv
  end if
  set command to \"cd '"$PWD"' ;\" & command
  if length of argv is greater than 1
    set profile to item 2 of argv
    runWithProfile(command, profile)
  else
    runSimple(command)
  end if
end run

on runSimple(command)
  tell application \"Terminal\"
    activate
    set newTab to do script(command)
  end tell
  return newTab
end runSimple

on runWithProfile(command, profile)
  set newTab to runSimple(command)
  tell application \"Terminal\" to set current settings of newTab to (first settings set whose name is profile)
end runWithProfile
" | osascript - "$@" > /dev/null

ApplescriptでこれをPWDに設定する方法があるかもしれません。

注:これを使用すると、2つのターミナルウィンドウが表示されることがあります。1つは〜で実行されるシェル、もう1つはcdコマンドとargv [1]からのコマンドを実行するシェルです。ターミナルがまだ実行されていない場合に発生するようです。おそらくそれは古い状態を開いています(閉じたときに開いていたターミナルがなかったとしても)。

1
djb

次のコマンドでターミナルを起動できますが、色の指定方法がわかりません。

 open /Applications/Utilities/Terminal.app/
1
jhuebsch