I know that you can create aliases in the ~/.bash_profile that automate bash commands like:
alias fly="ssh username#ip_address -p22"
But I was wondering if it was possible to automate tasks within applications on the Mac. So, for example, I know that you can make an alias to open the System Preferences:
alias sys="open /Applications/System\ Preferences.app/"
But how do you automate navigating within the System Preferences app? For example, I find myself opening the System Preferences, typing 'network', and then pressing enter frequently to navigate to the Network settings.
Is there a way to automate these series of steps with an alias? Or are aliases limited to bash commands?
Shell aliases are limited to shell commands. But many OS X applications can be controlled by AppleScript commands, and those can be issued with the shell command osascript. Quoting gets a little tricky, though, because your AppleScript commands often contain quotes, which then need to be wrapped in another layer of quotes in the shell command, which then need to be wrapped in another layer of quotes when you define the alias.
See macosxautomation.com for notes on using AppleScript (and this page for System Preferences specifically). To get System Preferences to show the Network pane, you could use this AppleScript:
tell application "System Preferences"
reveal pane id "com.apple.preference.network"
activate
end tell
...which can be issued with this osascript command (note that each line of the script corresponds to a -e argument, and the AppleScript double-quotes are wrapped in single-quotes for the shell):
osascript -e 'tell application "System Preferences"' -e 'reveal pane id "com.apple.preference.network"' -e 'activate' -e 'end tell'
And you could create an alias for this:
alias networkprefs="osascript -e 'tell application \"System Preferences\"' -e 'reveal pane id \"com.apple.preference.network\"' -e 'activate' -e 'end tell'"
Note that I had to escape the double-quotes that're intended for AppleScript consumption... rather confusing. I'd use a shell function instead (similar to an alias, but without the quoting weirdness):
networkprefs() {
osascript -e 'tell application "System Preferences"' -e 'reveal pane id "com.apple.preference.network"' -e 'activate' -e 'end tell'
}
Related
I'm on macOS which is currently using the zshell.
I would like to run a command in one shell which opens another shell preferably in another tab in the same window and then runs a given command. For example:
> openTab
would open another tab and run a basic command like ls.
Is this possible to do?
It appears that the open command will open new window, but I want it to be opened as a new tab in the current window. See here
Osascript appears a bit messy, is there way to do this natively with zshell?
You can use AppleScript, via osascript to do exactly that:
function runInNewTab() {
osascript >/dev/null <<EOF
tell application "System Events"
tell process "Terminal" to keystroke "t" using command down
end tell
tell application "Terminal" to do script "$*" in front window
EOF
}
Run it like this:
runInNewTab ls -l ~
Inside a bash script, I need to know what the current OS X terminal theme is. How can this be done?
I check the output of the env command, but didn't find anything.
We can use an AppleScript to retrieve the name of the profile of the foremost Terminal window from within a bash shell:
echo 'tell application "Terminal" to return name of current settings of first window' | osascript
We can similarly set the profile:
echo 'tell application "Terminal" to set current settings of first window to settings set "Basic"' | osascript
Replace "Basic" with the name of the profile you wish to adopt.
These commands will apply to the current/foremost tab or window of Terminal.app
I've also written a script that will get/set the profile depending on whether a profile name is provided: https://github.com/starbase527/dotfiles/blob/master/local/bin/term-profile . Example usage:
# Gets profile name
> term-profile
Basic
# Sets profile to Basic
> term-profile Basic
>
On a per-shell basis, you can't. You can get the default setting:
defaults read com.apple.Terminal "Default Window Settings"
Or the new window setting:
defaults read com.apple.Terminal "Startup Window Settings"
Directly in zsh, you can get the current Terminal.app theme like this:
CURRENT_THEME=$(osascript -e 'tell application "Terminal" to return name of current settings of first window')
echo $CURRENT_THEME
From that, and with some AppleScript knowledge, you can get some of the details of the Terminal.app
Happy coding 🖖
I am trying to find a method to combine two scripts so that they can be run in one go. However, it would be useful if both scripts still ran in separate windows as I need to look through the logs for certain bits of information. Any help would be much appreciated!
If you have X11 installed (e.g. XQuartz), you can run your scripts in new xterm windows:
xterm -e ./scriptA.sh & xterm -e ./scriptB.sh &
But if you want to use the default OSX Terminal.app, this should work:
open -a Terminal.app ./scriptA.sh; open -a Terminal.app ./scriptB.sh
I tried passing arguments to the scripts using the --args parameter to open, but for some reason it didn't work for me.
Update
The more OSX idiomatic way to do this is seems to be to start Terminal.app from an Applescript snippet with the osascript command:
osascript -e "tell application \"Terminal\" to do script \"scriptA.sh <args>\""
osascript -e "tell application \"Terminal\" to do script \"scriptB.sh <args>\""
The quotes are escaped so you can e.g. do variable expansions from the calling bash for the script args.
I am trying to use Platypus to create an app launcher for an interactive command-line program on OSX 10.8. I want to be able to double-click on my application, and have a Terminal window open, running my program. The problem is that my Applescript, (borrowed from Octave, and adapted for Julia) launches a Terminal window and attempts to spit some commands into it, however I have a rather hefty ~/.bash_profile that interferes with this. Is there a way to get my Applescript to open a non-login shell, or not source ~/.bash_profile, etc?
Here's the script that Platypus runs:
# This is the startup procedure written as AppleScript to open a
# Terminal.app (if the Terminal.app is not already running) and start
# the Julia program.
# 20071007 removed: open -a /Applications/Utilities/Terminal.app
osascript 2>&1>/dev/null <<EOF
tell application "System Events" to set ProcessList to get name of every process
tell application "Terminal"
activate
if (ProcessList contains "Terminal") or ((count of every window) is less than 1) then
tell application "System Events" to tell process "Terminal" to keystroke "n" using command down
end if
do script ("exec bash -c \"PATH=${ROOT}/julia/bin:${PATH} OPENBLAS_NUM_THREADS=1 FONTCONFIG_PATH=${ROOT}/julia/etc/fonts GIT_EXEC_PATH=${ROOT}/julia/libexec/git-core GIT_TEMPLATE_DIR=${ROOT}/julia/share/git-core exec '${ROOT}/julia/bin/julia'\"") in front window
end tell
EOF
# Quit the Julia.application immediately after startup (ie. quitting
# it in the taskbar) because once it is started it cannot be restarted
# a second time. If Julia.app stays (eg. because of a crash) opened
# then restarting is not possible.
osascript 2>&1>/dev/null <<EOF
tell application "julia"
quit
end tell
EOF
In general, you don't need a Terminal window to execute command line stuff. You would only use the Terminal if there was information you need to manually type in by hand. So you can probably just run the command using "do shell script" instead of "do script" in a Terminal window. Note that doing it this way won't use your bash profile file. So try this command all by itself in the applescript...
do shell script ("exec bash -c \"PATH=${ROOT}/julia/bin:${PATH} OPENBLAS_NUM_THREADS=1 FONTCONFIG_PATH=${ROOT}/julia/etc/fonts GIT_EXEC_PATH=${ROOT}/julia/libexec/git-core GIT_TEMPLATE_DIR=${ROOT}/julia/share/git-core exec '${ROOT}/julia/bin/julia'\"")
Then you can add your other applescript commands as needed, just don't use the Terminal and thus your bash profile won't be used.
2 part question:
I'm simply trying to run programs using applescript from the terminal, so I tried:
$ osascript tell application "iTunes" to activate
and get the error:
osascript: tell: No such file or directory
Giving the full path to the program did not work either. What am I missing? The second part of the question is what I eventually want to use applescript for. I would like to use it to open an application I built using py2app. Can applescript open any mac app or just certain ones that are already compatible.
Thanks
Try this. Notice you use "-e" when you are writing the command. Without "-e" you would give a path to an applescript to run. Also notice the string command must be in quotes.
osascript -e "tell application \"iTunes\" to activate"
And if you have a multi-line applescript you use "-e" before each line like this...
osascript -e "tell application \"iTunes\"" -e "activate" -e "end tell"
If you want to open an application just use the unix "open" command...
open "/path/to/application"
If you wanted to open an application using applescript and the "activate" command doesn't work (it should work for almost everything though) then tell the Finder to open it. Remember that applescript uses colon delimited paths...
osascript -e "tell application \"Finder\" to open file \"path:to:application\""
In a bash shell (like in Terminal), you can send multiple lines to osascript by using a "here document".
osascript -e "tell application \"iTunes\"" -e "activate" -e "end tell"
becomes
osascript <<EOF
tell application "iTunes"
activate
end tell
EOF
As an old-skool Unix hacker, I save these little snippets in my $HOME/bin directory and call them from the command line. Still learning the particulars, though.
Alan
an alternative to osascript:
open -a Calendar
close by:
pkill Calendar
Try:
do shell script "open /Applications/iTunes.app"
you need to put single quotes around the tell:
osascript -e 'tell app "iTunes" to activate'
otherwise you're defining a variable when you run -e
I'am new to script too.
I am confused to so I scan an essay named AppleScript Language Guide
and when I go through script commands items, I learn that if you want to activate an application in mac os with applescript editor you should type beneath code in your editor and then compile and run them! may this answer will help you, here's code:
// applescript editor code
----------
activate application "iTunes" line 1
----------
tell application "iTunes" to activate line 2