Archive
Open a new tab (or window) in Mac OSX Terminal and run command
[ UPDATE ]
After implementing the ruby code by user tig I was like, did I just make things more complicated than they should be? I was surprised that I didn’t first think about using the following applescript instead.
put the following codes in ~/.bash_profile
comm_tw() {
[ $# -lt 2 ] && return
osascript -e "
tell application \"System Events\" to tell process \"Terminal\" to keystroke \"$1\" using command down
tell application \"Terminal\" to do script \"$2\" in selected tab of the front window
" > /dev/null 2>&1
}
newt() {
comm_tw t "$1"
}
neww() {
comm_tw n "$1"
}
All I need to do then is to run either newt (to open a new tab or neww (to open a new window) and run command(s) in it. For example:
newt "ls -l ~; uptime" neww "date; who am i"
It’s worth noting that commands separated by semi-colon are allowed.
[ Initial Edit ]
I was looking for a solution to open a new tab (or window) and run a command (ssh for example) as sometimes I need to ssh to a number of hosts at once. I found the answer here. It’s almost what I needed for the tab part. I decided to change the ruby code (by sueruser.com user tig) a bit so I can use an option [ which is -w ] to run command in a new window. I am gonna post the code below. You can also fork me on github.
#!/usr/bin/env ruby
# A ruby script to open a new tab (or a new window) and run command in it on Mac OS X
# Modified based on the answer from tig regarding question posted at
# http://superuser.com/questions/174576/opening-a-new-terminal-from-the-command-line-and-running-a-command-on-mac-os-x
# Expands its feature a bit by allowing -w option top run command in a new window
# Usage Example:
# ./dt ls -l
# ./dt -w top
#
# Tested with Ruby 1.8.7
require 'rubygems'
require 'shellwords'
require 'appscript'
class Terminal
include Appscript
attr_reader :terminal, :current_window
def initialize
@terminal = app('Terminal')
@current_window = terminal.windows.first
yield self
end
def tab(dir, command = nil, mode = 't')
app('System Events').application_processes['Terminal.app'].keystroke(mode, :using => :command_down)
cd_and_run dir, command
end
def cd_and_run(dir, command = nil)
run "clear; cd #{dir.shellescape}"
run command
end
def run(command)
command = command.shelljoin if command.is_a?(Array)
if command && !command.empty?
terminal.do_script(command, :in => current_window.tabs.last)
end
end
end
Terminal.new do |t|
if ARGV.length>=1 && ARGV.first == '-w'
t.tab(Dir.pwd, ARGV[1, ARGV.length], 'n')
else
t.tab(Dir.pwd, ARGV)
end
end
As a side note, tmux can also be used for this kind of tasks with better scripting support. The only problem I might run into is hot key conflicts between local and remote hosts as most of the hosts I need to access are using tmux.