Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

Opening a new terminal from the command line and running a command on Mac OS X?

Writer Matthew Barrera

Is there a way of opening a new terminal from the command line, and running a command on that new terminal (on a Mac)?

e.g., Something like:

Terminal -e ls

where ls is run in the new terminal.

2

6 Answers

osascript -e 'tell app "Terminal" do script "echo hello"
end tell'

This opens a new terminal and executes the command "echo hello" inside it.

4

You can do it in a roundabout way:

% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command

Shell scripts which have the extension .command and which are executable, can be double-clicked on to run inside a new Terminal window. The command open, as you probably know, is equivalent to double-clicking on a Finder object, so this procedure ends up running the commands in the script within a new Terminal window.

Slightly twisted, but it does appear to work. I feel sure there must be a more direct route to this (what is it you're actually trying to do?), but it escapes me right now.

4

This works, at least under Mountain Lion. It does initialize an interactive shell each time, although you can replace that after-the-fact by invoking it as "macterm exec your-command". Store this in bin/macterm in your home directory and chmod a+x bin/macterm:

#!/usr/bin/osascript
on run argv tell app "Terminal" set AppleScript's text item delimiters to " " do script argv as string end tell
end run 

One liners are great

osascript -e 'tell app "Terminal" to do script "cd ~/somewhere"'

Chaining commands is great too

osascript -e 'tell app "Terminal" to do script "cd ~/somewhere &&
ls -al &&
git status -s &&
npm start"'
#!/usr/bin/env ruby1.9
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) app('System Events').application_processes['Terminal.app'].keystroke('t', :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| t.tab Dir.pwd, ARGV.length == 1 ? ARGV.first : ARGV
end

You need ruby 1.9 or you will need to add line require 'rubygems' before others requires and don't forget to install gem rb-appscript.

I named this script dt (dup tab), so I can just run dt to open tab in same folder or dt ls to also run there ls command.

I would do this with AppleScript. You can streamline it by using the osascript command. Your script would be something like:

tell application "Terminal" activate tell application "System Events" keystroke "t" using {command down} end tell
end tell

If you're only going to ever access it in terminal, then you can omit all but the middle tell statement. If you want a new window instead of a new tab, replace the t keystroke with n.

I'm not an experienced enough AppleScripter to know how to get command-line arguments and then retype them in the new window, but I'm sure it's possible and not too difficult.

Also, I think this works and I'm not able to test right now, but I'm pretty sure you can start a shell script with some variant on #!/usr/bin/osascript -e and then save it as an executable however you want. Which, at least in my head, would make it possible for you to type something like $ runinnewterm ls /Applications

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy