TerminalCommander Reference

Synopsis

What ?

ターミナルでのシェルコマンドの実行を支援する AppleScript ライブラリです。ターミナルでシェル コマンドは「do script」コマンドで簡単に実行できますが、次のような、より複雑な処理を行いたいときにこのライブラリは役に立ちます。

Basic Usage

TerminalCommander の基本的な使い方は、次のような手順になります。

  1. make もしくは、make_with_title, make_with_setting メソッドでインスタンスを生成します。
  2. インスタンスに対して、タイトルもしくは設定セット名を設定します。
  3. do もしくは do_with でシェルコマンドを実行します。
  4. 必要があれば、wait_termination でコマンドの終了を待ちます。
  5. do もしくは do_with で再びコマンドを実行します。
use TerminalCommander : script "TerminalCommander"

tell TerminalCommander's make_with_settings("Ocean")
set_custom_title("* Sample Terminal *")
set_execution_string("echo 'This is a new terminal.'")
do("ls -l")
wait_termination(300)
do_with({command:"echo 'You can execute command in the same terminal'", with_activation:false})
end tell

Finding a Terminal by a Woking Directory

TerminalCommander は、以下のシェルスクリプトを~./bash_profile もしくは ~/.zprofile に追加すると、シェルの Working Directory でターミナルを見つけられるようになります。

このシェルスクリプトは、コマンドプロンプトが更新されるたびに、~/.cwd-tty ファイルにtty デバイス名とworking directory の対応を記録します。

TerminalCommander のバンドル内の納められています。以下のように、source コマンドで実行すると良いでしょう。

source '~/Library/Scripts Libraries/TerminalComannder.scpt/Contents/Resources/cwd-tty.sh'

# cwd-tty.sh
#
# script to mainten a correspondence table between ttyname and
# working directory.
# Insert following line into .zprofile or .bash_profile.
#
#   source path-to-dir/cwd-tty.sh
#

# 2.0 -- 2020-01-09
#   * Added support of zsh

if [[ $TERM_PROGRAM = 'Apple_Terminal' ]] && [[ -z $INSIDE_EMACS ]]; then
  save_cwd() {
    local ttyname=`tty`;
    if [[ ! -e ~/.cwd-tty ]]; then
      echo "$ttyname	$PWD" > ~/.cwd-tty
      return
    fi

    local out=()
    local matched=0
    local LINE
    while read LINE ; do
      newline="${ttyname}	${PWD}"
      case $LINE in
        ${newline})
          return;;
        ${ttyname}"	"*)
            out+=("$newline")
            matched=1;;
        *)
          out+=("$LINE");;
      esac
    done < ~/.cwd-tty

    if [[ $matched -eq 0 ]]; then
      out+=("$ttyname	$PWD")
    fi
    IFS=$'\n'
    echo "${out[*]}" > ~/.cwd-tty
    unset IFS
  }

  if [[ -n $ZSH_VERSION ]]; then
    autoload add-zsh-hook
    add-zsh-hook precmd save_cwd
  else
    PROMPT_COMMAND="save_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
  fi
fi

次のように、set_working_directory で目的の directory を設定すると、~/.cwd-tty ファイルを読み込んで、目的のディレクトリの tty デバイスを調べ、tty デバイスからターミナルを探します。

ターミナルが見つからない場合には、新しいターミナルを開きますが、do コマンドには set_working_directory で設定された場所に cd する動作は含まれていません。確実に指定した場所でコマンドを実行するには、set_execution_string で cd コマンドを設定してください。execution string は新しいターミナルで一番最初に実行されるコマンドです。

次のサンプルでは、3回シェルコマンドを実行しています。3回目のシェルコマンドの実行の際には1回目のターミナルと同じ working directory を指定しています。そのため、3回目のシェル コマンドは1回目のターミナルでコマンドが実行されることに注目してください。

use TerminalCommander : script "TerminalCommander"

tell (make TerminalCommander) -- first terminal
do("cd /Users")
end tell

tell (make TerminalCommander) -- second terminal
do("echo 'second terminal'")
end tell

delay 1

tell (make TerminalCommander)
set_working_directory("/Users")
set_execution_string("cd /Users") -- executed when new terminal is opened.
do("echo 'Find a terminal by working directory.'") -- this command will be sent to the first terminal.
end tell
TerminalCommander Reference