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.
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.
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
This opens a new terminal and executes the command "echo hello" inside it.
osascript -e 'tell app "Terminal" to do script "echo hello"'
May 9, 2013 at 4:03
"$@"
in shell but in osa script?
osascript -e 'tell app "Terminal" to do script "cd ~/somewhere"'
osascript -e 'tell app "Terminal" to do script "cd ~/somewhere &&
ls -al &&
git status -s &&
npm start"'
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.
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
#!/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.
The top answer worked for me. But in my case (as a script for Raycast), it wasn't bringing the new terminal window to the foreground. I fixed that by adding the "activate" command, like this:
osascript -e 'tell app "Terminal" to activate' -e 'tell app "Terminal" to do script "/your/command"'
I also wanted the shell and window to close automatically afterwards because it was for an interactive program. So I added && exit
to the end of the shell command, like this:
osascript -e 'tell app "Terminal" to activate' -e 'tell app "Terminal" to do script "/your/command && exit"'
If you're wanting to close the window automatically like this (and not just exit the shell with a "[Process completed]" message), make sure your Terminal settings have the "Close the window" option set for what to do when the shell exits (under Terminal/Settings.../Profiles/Shell).
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