次のように、xtermをコマンドライン(またはシステムコールを介したプログラム)から起動できます。
/usr/X11/bin/xterm -fg SkyBlue -bg black -e myscript
これは、青いテキストと黒い背景でxtermを起動し、その中で任意のスクリプトを実行します。
私の質問:Terminal.appで同等のことをするにはどうすればよいですか?
ターミナルプロファイルの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
のようなものがより適切であり、たとえば、簡単に新しいコマンドを呼び出さずに、指定されたプロファイルの端末)。そして、複雑な引用でそれを台無しにする方法があったとしても、私は驚かないでしょう。しかし、ほとんどの目的で機能します。
バンドルIDでアプリを開き、他のパラメーターを指定することもできます。
現在のディレクトリに実行可能なスクリプトtest.shがある場合、次のコマンドでTerminal.appが開き、実行されます。
open -b com.Apple.terminal test.sh
私が見つけられる唯一の欠点は、ターミナルが現在の環境を継承していないように見えるため、実行するスクリプトにパラメーターを渡す別の方法を準備する必要があることです。パラメータを埋め込むためにその場でスクリプトを構築することは、1つのアプローチになると思います(もちろん、セキュリティへの影響を考慮に入れて...)
ほとんどすべて(すべて?)の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、
ジュハ
また、ターミナルGUIに移動し、オプションを完全に設定して「.terminal」ファイルにエクスポートしたり、構成をウィンドウグループにグループ化してターミナルファイル「myGroup.terminal」にエクスポートしたりすることもできます。 。その後
myGroup.terminalを開きます
すべての設定と起動コマンドが構成された状態で、ターミナルが一度に開きます。
上記の@ 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]からのコマンドを実行するシェルです。ターミナルがまだ実行されていない場合に発生するようです。おそらくそれは古い状態を開いています(閉じたときに開いていたターミナルがなかったとしても)。
次のコマンドでターミナルを起動できますが、色の指定方法がわかりません。
open /Applications/Utilities/Terminal.app/