Execute a Terminal Command using AppleScript (Mountain Lion) - macos

This used to work in pre-Mountain Lion OS X:
tell application "Terminal"
activate
do script "cd /"
end tell
Now, the new bash window is opened, but nothing is executed, no mater what the command-line script.
It's broken on the few systems I've tried it on, but is it a general problem? Is there a workaround?

Works as expected for me.
Any recent changes to your environment or .bashrc?
bash$ cat t.applescript
tell application "Terminal"
activate
do script "cd /"
end tell
 
bash$ osascript t.applescript
tab 1 of window id 9766
 
New Terminal window opens, "cd /" is visible in buffer, and shell is at /.
bash$ uname -smr
Darwin 12.2.0 x86_64
Edit: verified on 10.8.3 too
bash$ uname -smr
Darwin 12.3.0 x86_64

Check Terminal.app's Preferences, there are many options for new windows and what Shell to open at startup and many more–

Related

On osx, how to open new iterm terminal tab from one script then run command in that temrinal window

I am running osx. I have a script which runs the full stack then runs grunt at the end. I want to be able to separate running grunt in a separate terminal tab, i am using iterm.
I have tried something like
open -a Terminal "cd ~/dev/work/poc/user-interface/src/main/webapp; grunt"
any ideas?
This should do it for you (obviously change dir & command):
osascript -e '
tell app "iTerm"
activate
tell the first terminal
launch session "Default Session"
tell the last session
set name to "New Session"
write text "cd /usr/bin; ls"
end tell
end tell
end tell'
It's a slightly modified version of something I wrote to add iTerm support for RStudio.
Like this:
#!/bin/bash
osascript -e '
tell application "Terminal"
do script "date"
activate
end tell'
Replace date with whatever you want it to do.

Call osascript through perl in OSX 10.9 doesn't work anymore

I'm writing an application for Mac (OSX, not iOS).
The installation runs a perl script which contains some "osascript" call, for example:
$res = qx(osascript -e 'launch application "MyApp"');
Or:
$res = qx(osascript -e 'tell application "System event" to make login item at end with properties {path:".... .app", hidden: false}');
and more...
I have two Mac machines, one with OSX 10.9 and other with OSX 10.7.
When I'm running the installation on OSX 10.7 - All works good.
When I'm running the installation on OSX 10.9 - the call to osascript doesn't work (all of them, not only one). I tried to run only the osascript command in terminal, and it works!
The installation process done from user (not admin) but ask for admin permission during the installation.
Someone know what have been changed in the new OSx?
Thanks!

Taking screen shot of current OS X or iTerm terminal window

In Linux, I'm using imagemagick import -window $WINDOWID to take a screencapture of the terminal.
Is there something similar in OS X?
You want to be using screencapture rather than import, which only works on X11 windows.
If the window is in front, you can try:
screencapture -l$(osascript -e 'tell app "Terminal" to id of window 1') test.png
See this question for some more background.
Try the tty command.
$ tty
/dev/ttys001
You can see what commands are running on that terminal by using `ps -t :
$ ps -t s001 #Where `tty` returns /dev/ttys001
You can also try pgrep too:
$ pgrep -t s001
Edit (You can/I can)
Oh, this is for a screen capture... Wasn't in the OP.
$WINDOWID is a X11 thing, and so is imagemagick. Linux GUI (both KDE and Gnome) are based upon the X11 protocol. The Mac GUI isn't.
On Mac OS X, there's a screencapture command. I haven't used it, but let's look at the manpage:
The screencapture utility is not very well documented to date.
You're on your own.
One more trick...
You can run the X11 server on the Mac. The server is no longer included in Mountain Lion, but Apple recommends you to install it from the XQuartz Project.
You can run the X11 server, then use XTerm windows which will have a Windows ID that can be used with imagemagick.
( Command + Control + Shift + 4 + Space ) for capturing a screenshot of the app window ..
Refer to this link: https://support.apple.com/en-us/HT201361 for learning more about capturing screenshots in macOS.. 👍

Open xterm telnet connection (Mac OS X)

I have been trying to get this script right for hours and came pretty far, but i'm stuck by passing commands to the X11 xterm window.
I need a connection to an xterm telnet server. This is the normal procedure:
open Terminal
type the command: xterm -fa Monaco -fs 12 (This opens an X11 window, with a bigger font)
in the new xterm window i type: telnet -l username server ip
this opens the telnet connection and prompts for the password
because some users w/o terminal knowledge have to have access to this connection i tried several approaches to write a script that would run on a Mac. And open the connection to let users work in the opened telnet window. I ended up with using AppleScript for that, and wrote the following script:
tell application "X11"
activate
end tell
tell application "System Events"
tell process "X11"
tell menu bar 1
tell menu "Applications"
click menu item "Terminal"
tell window 1
run
do script "xterm -fa Monaco -fs 12"
delay 2
do script "telnet -l meister 192.169.25.1"
end tell
end tell
end tell
end tell
end tell
But unfortunately this doesn't work. It only opens an X11 xterm window, w/o the bigger fonface, and w/o the terminal command, it is just an empty window.
Does someone of you have a idea how i could change the script so it works, or maybe there is a way to do it with some other type of script rather that AppleScript?
Thank you very much for your help in advance!
First, to launch the xterm just do this:
do shell script "xterm -fa Monaco -fs 12 -wf"
This will automatically launch X11 if needed.
Depending on your system, /usr/X11/bin may not be on the path, so you may want to do this instead:
do shell script "/usr/X11/bin/xterm -fa Monaco -fs 12 -wf"
And if you want xterm to run a command instead of just opening a shell, use the -e parameter:
do shell script "/usr/X11/bin/xterm -fa Monaco -fs 12 -e telnet -l meister 192.169.25.1"
If the telnet command fails, the xterm window will close instantly; to debug that, add a "-hold" before "-e".
Since you asked about "some other type of script rather than apple script", the same thing is obviously a one-liner in bash, two with the shebang:
#!/bin/sh
/usr/X11/bin/xterm -fa Monaco -fs 12 -e telnet -l meister 192.169.25.1
If you save that as "doit" and "chmod +x doit", you can run it from the Terminal as "./doit".
Or, if you want it double-clickable in Finder, rename it to "doit.command".
Try:
tell application "X11"
activate
tell application "System Events" to tell process "X11"
click menu item "Terminal" of menu 1 of menu bar item "Applications" of menu bar 1
delay 0.5
keystroke "xterm -fa Monaco -fs 12"
delay 0.5
keystroke return
delay 0.5
keystroke "telnet -l meister 192.169.25.1"
delay 0.5
keystroke return
end tell
end tell

OSX - How to auto Close Terminal window after the "exit" command executed.

When I'm done with Terminal, I want to exit it. Right now, I have three options:
killall Terminal. It will end the process, but rather abruptly. I don't think this is the best idea.
Call exit. I've changed the settings so exit closes Terminal. The app still appears open in the Dock though, and doesn't do what I want it to do.
Right click>Quit. However, this isn't a Terminal command to exit it.
So now, what is the way I should exit and close Terminal? I've heard something about osascript but I'm not too sure. I want to exit and close, so that Terminal is no longer open, both as a window and as a process.
in Terminal.app
Preferences > Profiles > (Select a Profile) > Shell.
on 'When the shell exits' chosen 'Close the window'
How about the good old Command-Q?
Actually, you should set a config on your Terminal, when your Terminal is up press ⌘+, then you will see below screen:
Then press shell tab and you will see below screen:
Now select Close if the shell exited cleanly for When the shell exits.
By the above config each time with exit command the Terminal will close but won't quit.
In the Terminal app, Preference >> Profiles tab.
Select the Shell tab on the right.
You can choose Never Ask before closing to suppress the warning.
You could use AppleScript through the osascript command:
osascript -e 'tell application "Terminal" to quit'
In a terminal window, you can type:
kill -9 $(ps -p $PPID -o ppid=)
This will kill the Terminal application process, which is the parent of the parent of the current process, as seen by the kill command.
To close a Terminal window from within a running script, you need to go up one more level in the process hierarchy like this:
kill -9 $(ps -p $(ps -p $PPID -o ppid=) -o ppid=)
I 've been using ctrl + d. It throws you out into the destination where You've started the sqlite3 command in the first place.
osascript -e "tell application \"System Events\" to keystroke \"w\" using command down"
This simulates a CMD + w keypress.
If you want Terminal to quit completely you can use:
osascript -e "tell application \"System Events\" to keystroke \"q\" using command down"
This doesn't give any errors and makes the Terminal stop cleanly.
You can also use this convoluted command, which does not trigger a warning about terminating its own process:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit
This command is quite long, so you could define an alias (such as quit) in your bash profile:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'
This would allow you to simply type quit into terminal without having to fiddle with any other settings.
Use the osascript command in your code as icktoofay mentioned: osascript -e 'tell application "Terminal" to quit'
Then, open Terminal preferences, go to Settings > Shell, and set "Prompt before closing:" to "Never." Terminal should now quit completely (not remain open in your dock) and ignore the prompt before quitting. If you have only one Terminal window open and the osascript command is your last line of code, it should wait for whatever command you ran before to finish.
This would not be ideal if you are running scripts in the same window or other windows in the background (for instance, you may run a command in the background and continue using the current window for other commands if the first command is followed by an ampersand); be careful!
If you wrap the osascript code in a shell script file, you can probably call it with whatever pithy file-name you give it---as long as it is in Terminal's search path (run echo $PATH to see where Terminal looks for scripts).
I've been using
quit -n terminal
at the end of my scripts. You have to have the terminal set to never prompt in preferences
So Terminal > Preferences > Settings > Shell
When the shell exits
Close the window
Prompt before closing
Never
Create a script:
cat ~/exit.scpt
like this:
Note: If there is only one window, just quit the application, else simulate command + w to close the tab)
tell application "Terminal"
set WindowNum to get window count
if WindowNum = 1 then
quit
else
tell application "System Events" to keystroke "w" using command down
end if
end tell
Then add a alias in your *shrc
just like vi ~/.bashrc or zshrc (anything else?)
add it:
alias exit="osascript ~/exit.scpt"
And source the ~/.bashrc or reopen your terminal.app
This is what I did for a command I just wrote. I wanted to be able to create a "shortcut" to the Backup directory for Apple Configurator that worked on different computers, but since it's relative to the user's home directory, I needed to make it a .command file. Here are the contents:
#!/usr/bin/env bash
open "${HOME}/Library/Application Support/MobileSync/Backup"
(sleep 0.1 ; osascript -e 'tell application "Terminal" to quit') &
I tried several variations of the answers here. No matter what I try, I can always find a use case where the user is prompted to close Terminal.
Since my script is a simple (drutil -drive 2 tray open -- to open a specific DVD drive), the user does not need to see the Terminal window while the script runs.
My solution was to turn the script into an app, which runs the script without displaying a Terminal window. The added benefit is that any terminal windows that are already open stay open, and if none are open, then Terminal doesn't stay resident after the script ends. It doesn't seem to launch Terminal at all to run the bash script.
I followed these instructions to turn my script into an app: https://superuser.com/a/1354541/162011
If this is a Mac you type 'exit' then press return.

Resources