A curated list of shell commands and tools specific to OS X.
“You don’t have to know everything. You simply need to know where to find it when necessary.” (John Brunner)
If you want to contribute, you are highly encouraged to do so. Please read the contribution guidelines.
For more terminal shell goodness, please also see this list's sister list Awesome Command Line Apps.
- Appearance
- Applications
- Backup
- Developer
- Disks and Volumes
- Dock
- Documents
- Finder
- Fonts
- Hardware
- Input Devices
- Media
- Networking
- Package Managers
- Printing
- Security
- Search
- System
- Terminal
defaults write com.apple.universalaccess reduceTransparency -bool true
defaults write com.apple.universalaccess reduceTransparency -bool false
Up to Mountain Lion:
osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/path/to/picture.jpg"'
Since Mavericks:
sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "update data set value = '/path/to/picture.jpg'" && killall Dock
find /Applications -path '*Contents/_MASReceipt/receipt' -maxdepth 4 -print |\sed 's#.app/Contents/_MASReceipt/receipt#.app#g; s#/Applications/##'
sudo rm -rf /var/db/RemoteManagement ; \
sudo defaults delete /Library/Preferences/com.apple.RemoteDesktop.plist ; \
defaults delete ~/Library/Preferences/com.apple.RemoteDesktop.plist ; \
sudo rm -r /Library/Application\ Support/Apple/Remote\ Desktop/ ; \
rm -r ~/Library/Application\ Support/Remote\ Desktop/ ; \
rm -r ~/Library/Containers/com.apple.RemoteDesktop
launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist
The AppleScript code below will quit Mail, vacuum the SQLite index, then re-open Mail. On a large email database that hasn't been optimized for a while, this can provide significant improvements in responsiveness and speed.
(*
Speed up Mail.app by vacuuming the Envelope Index
Code from: http://www.hawkwings.net/2007/03/03/scripts-to-automate-the-mailapp-envelope-speed-trick/
Originally by "pmbuko" with modifications by Romulo
Updated by Brett Terpstra 2012
Updated by Mathias Törnblom 2015 to support V3 in El Capitan and still keep backwards compability
*)
tell application "Mail" to quit
set os_version to do shell script "sw_vers -productVersion"
set mail_version to "V2"
considering numeric strings
if "10.10" <= os_version then set mail_version to "V3"
end considering
set sizeBefore to do shell script "ls -lnah ~/Library/Mail/" & mail_version & "/MailData | grep -E 'Envelope Index$' | awk {'print $5'}"
do shell script "/usr/bin/sqlite3 ~/Library/Mail/" & mail_version & "/MailData/Envelope\\ Index vacuum"
set sizeAfter to do shell script "ls -lnah ~/Library/Mail/" & mail_version & "/MailData | grep -E 'Envelope Index$' | awk {'print $5'}"
display dialog ("Mail index before: " & sizeBefore & return & "Mail index after: " & sizeAfter & return & return & "Enjoy the new speed!")
tell application "Mail" to activate
defaults write com.apple.Safari IncludeInternalDebugMenu -bool true && \
defaults write com.apple.Safari IncludeDevelopMenu -bool true && \
defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true && \
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled -bool true && \
defaults write NSGlobalDomain WebKitDeveloperExtras -bool true
Other options: get source
, get text
.
osascript -e 'tell application "Safari" to get URL of current tab of front window'
defaults write com.bohemiancoding.sketch3 exportCompactSVG -bool yes
defaults write com.apple.TextEdit RichText -int 0
This changes the interval to 30 minutes. The integer value is the time in seconds.
sudo defaults write /System/Library/Launch Daemons/com.apple.backupd-auto StartInterval -int 1800
hash tmutil &> /dev/null && sudo tmutil disablelocal
defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true
Function to quickly create an application icon from 1024px master file.
function mkicns() {
if [[ -z "$@" ]]; then
echo "Input file missing"
else
filename=${1%.*}
mkdir $filename.iconset
sips -z 16 16 $1 --out $filename.iconset/icon_16x16.png
sips -z 32 32 $1 --out $filename.iconset/icon_16x16@2x.png
sips -z 32 32 $1 --out $filename.iconset/icon_32x32.png
sips -z 64 64 $1 --out $filename.iconset/icon_32x32@2x.png
sips -z 128 128 $1 --out $filename.iconset/icon_128x128.png
sips -z 256 256 $1 --out $filename.iconset/icon_128x128@2x.png
sips -z 256 256 $1 --out $filename.iconset/icon_256x256.png
sips -z 512 512 $1 --out $filename.iconset/icon_256x256@2x.png
sips -z 512 512 $1 --out $filename.iconset/icon_512x512.png
cp $1 $filename.iconset/icon_512x512@2x.png
iconutil -c icns $filename.iconset
rm -r $filename.iconset
fi
}
Compiling MacVim via Homebrew with all bells and whistles, including overriding system Vim.
brew install macvim --HEAD --with-cscope --with-lua --with-override-system-vim --with-luajit --with-python
Install the development version of this modern Vim drop-in alternative via Homebrew.
brew tap neovim/neovim && \
brew install --HEAD neovim
xcode-select --install
xcrun simctl delete unavailable
Leaving this turned on is useless when you're using SSDs.
sudo pmset -a sms 0
The only reliable way to do this is by sending an AppleScript command to Finder.
osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)'
You don't have to use the Disk Utility GUI for this.
sudo diskutil repairPermissions /
Beginning with OS X El Capitan, system file permissions are automatically protected. It's no longer necessary to verify or repair permissions with Disk Utility. (Source)
bless --mount "/path/to/mounted/volume" --setBoot
diskutil list
A continuous stream of file system access info.
sudo fs_usage
hdiutil create -volname "Volume Name" -srcfolder /path/to/folder -ov diskimage.dmg
If you'd like to encrypt the disk image:
hdiutil create -encryption -stdinpass -volname "Volume Name" -srcfolder /path/to/folder -ov encrypted.dmg
By default, you'll be prompted for a password. You can automate that by piping in a password:
echo -n YourPassword | hdiutil create -encryption -stdinpass -volname "Volume Name" -srcfolder /path/to/folder -ov encrypted.dmg
This command applies to .iso, .img and .dmg images.
hdiutil burn /path/to/image_file
defaults write com.apple.frameworks.diskimages skip-verify -bool true && \
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true && \
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
bless --folder "/path/to/mounted/volume/System/Library/CoreServices" --bootinfo --bootefi
hdiutil attach /path/to/diskimage.dmg
hdiutil detach /dev/disk2s1
Like the Disk Utility "Restore" function.
sudo asr -restore -noverify -source /path/to/diskimage.dmg -target /Volumes/VolumeToRestoreTo
defaults write com.apple.dock persistent-others -array-add '{ "tile-data" = { "list-type" = 1; }; "tile-type" = "recents-tile"; }' && \
killall Dock
defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}' &&\
killall Dock
The float number defines the show/hide delay in ms.
defaults write com.apple.Dock autohide-delay -float 0 &&\
killall Dock
Supported formats are plain text, rich text (rtf) and Microsoft Word (doc/docx).
textutil -convert html file.ext
sudo chmod -RN /path/to/folder
chflags hidden /path/to/folder/
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
Show All Hidden Files
defaults write com.apple.finder AppleShowAllFiles true
defaults write com.apple.finder AppleShowAllFiles false
sudo chflags -R nouchg /path/to/file/or/folder
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
chflags nohidden ~/Library
defaults write .GlobalPreferences NSNavRecentPlacesLimit -int 10 && \
killall Finder
Useful if you’re on an older Mac that messes up the animation.
defaults write NSGlobalDomain NSScrollAnimationEnabled -bool false
Revert back to standard behavior.
defaults write NSGlobalDomain NSScrollAnimationEnabled -bool true
defaults write -g NSScrollViewRubberbanding -bool false
Revert to default behavior.
defaults write -g NSScrollViewRubberbanding -bool true
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true && \
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
defaults write com.apple.finder CreateDesktop -bool false && killall Finder
defaults write com.apple.finder CreateDesktop -bool true && killall Finder
defaults write com.apple.finder ShowPathbar -bool true
Possible values: WhenScrolling
, Automatic
and Always
.
defaults write NSGlobalDomain AppleShowScrollBars -string "Always"
defaults write com.apple.finder ShowStatusBar -bool true
Sets default save target to be a local disk, not iCloud.
defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
defaults write com.apple.finder NewWindowTarget -string "PfLo" && \
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}"
Sets size to 'medium'.
defaults write NSGlobalDomain NSTableViewDefaultSizeMode -int 2
Avoids creation of .DS_Store
and AppleDouble files.
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
Avoids creation of .DS_Store
and AppleDouble files.
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
If multiple windows are open, it chooses the top-most one.
cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')"
open http://www.github.com
open README.md
You can open applications using -a
.
open -a "Google Chrome" http://www.github.com
open /path/to/folder/
open .
To clear font caches for all users, put sudo
in front of this command.
atsutil databases -removeUser && \
atsutil server -shutdown && \
atsutil server -ping
networksetup -listallhardwareports
pmset -g batt | egrep "([0-9]+\%).*" -o --colour=auto | cut -f1 -d';'
pmset -g batt | egrep "([0-9]+\%).*" -o --colour=auto | cut -f3 -d';'
system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p'
system_profiler SPDisplaysDataType | grep Resolution
sysctl -n machdep.cpu.brand_string
Prevent sleep for 1 hour:
caffeinate -u -t 3600
sudo pmset -g
sudo pmset displaysleep 15
sudo pmset sleep 30
sudo systemsetup -getcomputersleep
sudo systemsetup -setcomputersleep 60
sudo systemsetup -setcomputersleep Never
sudo systemsetup -setrestartfreeze on
Play iOS charging sound when MagSafe is connected.
defaults write com.apple.PowerChime ChimeOnAllHardware -bool true && \
open /System/Library/CoreServices/PowerChime.app
defaults write com.apple.PowerChime ChimeOnAllHardware -bool false && \
killall PowerChime
defaults write -g NSAutomaticSpellingCorrectionEnabled -bool false
defaults write -g NSAutomaticSpellingCorrectionEnabled -bool true
defaults read -g NSAutomaticSpellingCorrectionEnabled
Disable the default "press and hold" behavior.
defaults write -g ApplePressAndHoldEnabled -bool false
Sets a very fast repeat rate, adjust to taste.
defaults write NSGlobalDomain KeyRepeat -int 0.02
afconvert input.mp3 ringtone.m4r -f m4af
sudo nvram SystemAudioVolume=" "
osascript -e 'set volume output muted true'
osascript -e 'set volume 4'
You can play all audio formats that are natively supported by QuickTime.
afplay -q 1 filename.mp3
say 'All your base are belong to us!'
defaults write com.apple.QuickTimePlayerX MGPlayMovieOnOpen 1
sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder ProgramArguments -array-add "-NoMulticastAdvertisements"
sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder ProgramArguments -array "/usr/sbin/mDNSResponder" "-launchd"
sudo ipconfig set en0 DHCP
ipconfig getpacket en0
sudo dscacheutil -flushcache && \
sudo killall -HUP mDNSResponder
sudo scutil --set ComputerName "newhostname" && \
sudo scutil --set HostName "newhostname" && \
sudo scutil --set LocalHostName "newhostname" && \
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName -string "newhostname"
ping -o github.com
traceroute github.com
This outputs all applications currently using port 80.
sudo lsof -i :80
dig +short myip.opendns.com @resolver1.opendns.com
networksetup -setairportnetwork en0 WIFI_SSID WIFI_PASSWORD
Create a symbolic link to the airport command for easy access:
sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/local/bin/airport
Run a wireless scan:
airport -s
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'
ipconfig getifaddr en0
defaults read /Library/Preferences/SystemConfiguration/com.apple.airport.preferences | grep LastConnected -A 7
Exchange SSID with the SSID of the access point you wish to query the password from.
security find-generic-password -D "AirPort network password" -a "SSID" -gw
networksetup -setairportpower en0 on
- Fink - The full world of Unix Open Source software for Darwin.
- Homebrew - The missing package manager for OS X.
- MacPorts - Compile, install and upgrade either command-line, X11 or Aqua based open-source software.
cancel -a -
defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true && \
defaults write NSGlobalDomain PMPrintingExpandedStateForPrint2 -bool true
defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /path/to/file
spctl --add /path/to/Application.app
spctl --remove /path/to/Application.app
First, install pwgen
via Homebrew, etc.
pwgen -Cs 20 1 | tr -d ' ' | tr -d '\n' | pbcopy
open /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
srm /path/to/file
srm -r /path/to/folder/
srm -rf /path/to/complete/destruction
find . -type f -name '*.DS_Store' -ls -delete
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
The -i
modifier makes the search case insensitive.
locate -i *.jpg
defaults write com.apple.NetworkBrowser BrowseAllInterfaces -bool true
osascript /path/to/script.scpt
sudo reboot
sudo poweroff
sw_vers
How long since your last restart.
uptime
cat whatever.txt | pbcopy
pbpaste | textutil -convert txt -stdin -stdout -encoding 30 | pbcopy
pbpaste | expand | pbcopy
pbpaste > whatever.txt
pbpaste | sort | uniq | pbcopy
If FileVault is enabled on the current volume, it restarts the system, bypassing the initial unlock. The command may not work on all systems.
sudo fdesetup authrestart
sudo fdesetup status
sudo sysdiagnose -f ~/Desktop/
sudo kextstat -l
sudo kextload -b com.apple.driver.ExampleBundle
sudo kextunload -b com.apple.driver.ExampleBundle
Run job every 5 minutes.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.touchsomefile</string>
<key>ProgramArguments</key>
<array>
<string>touch</string>
<string>/tmp/helloworld</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.touchsomefile</string>
<key>ProgramArguments</key>
<array>
<string>touch</string>
<string>/tmp/helloworld</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>45</integer>
<key>Hour</key>
<integer>13</integer>
<key>Day</key>
<integer>7</integer>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.watchhostconfig</string>
<key>ProgramArguments</key>
<array>
<string>syslog</string>
<string>-s</string>
<string>-l</string>
<string>notice</string>
<string>somebody touched /etc/hostconfig</string>
</array>
<key>WatchPaths</key>
<array>
<string>/etc/hostconfig</string>
</array>
</dict>
</plist>
To be independent of OS X version, this relies on locate
to find lsregister
. If you do not have your locate
database built yet, do it.
sudo $(locate lsregister) -kill -seed -r
sudo defaults write /Library/Preferences/com.apple.loginwindow LoginwindowText "Your text"
sudo purge
launchctl unload -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist && \
killall -9 NotificationCenter
launchctl load -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist
qlmanage -p /path/to/file
dsenableroot
dsenableroot -d
nvram boot-args
sudo nvram boot-args="-x"
sudo nvram boot-args=""
Takes a screenshot as JPEG after 3 seconds and displays in Preview.
screencapture -T 3 -t jpg -P delayedpic.jpg
Sets location to ~/Desktop
.
defaults write com.apple.screencapture location ~/Desktop && \
killall SystemUIServer
Sets format to png
. Other options are bmp
, gif
, jpg
, jpeg
, pdf
, tiff
.
defaults write com.apple.screencapture type -string "png"
defaults write com.apple.screencapture disable-shadow -bool true && \
killall SystemUIServer
Date and time remain unchanged.
defaults write com.apple.screencapture name "Example name" && \
killall SystemUIServer
installer -pkg /path/to/installer.pkg -target /
sudo softwareupdate -ia
Set to check daily instead of weekly.
defaults write com.apple.SoftwareUpdate ScheduleFrequency -int 1
sudo softwareupdate -l
mdutil -i off -d /path/to/volume
mdutil -i on /path/to/volume
mdutil -E /path/to/volume
mdfind -name 'searchterm'
Reboot while holding Cmd + R, open the Terminal application and enter:
csrutil disable && reboot
Reboot while holding Cmd + R, open the Terminal application and enter:
csrutil enable && reboot
Rings the terminal bell (if enabled) and puts a badge on it.
tput bel
- iTerm 2 - A better Terminal.app.
- TotalTerminal - A system-wide terminal available on a hot-key.
Install the latest version and set as current users' default shell:
brew install bash && \
sudo echo $(brew --prefix)/bin/bash >> /etc/shells && \
chsh -s $(brew --prefix)/bin/bash
- Homepage - The default shell for OS X and most other Unix-based operating systems.
Install the latest version and set as current users' default shell:
brew install fish && \
chsh -s $(brew --prefix)/bin/fish
- Homepage - A smart and user-friendly command line shell for OS X, Linux, and the rest of the family.
- The Fishshell Framework - Provides core infrastructure to allow you to install packages which extend or modify the look of your shell.
Install the latest version and set as current users' default shell:
brew install zsh && \
sudo sh -c 'echo $(brew --prefix)/bin/zsh >> /etc/shells' && \
chsh -s $(brew --prefix)/bin/zsh
- Homepage - Zsh is a shell designed for interactive use, although it is also a powerful scripting language.
- Oh My Zsh - An open source, community-driven framework for managing your Zsh configuration.
- Prezto - A speedy Zsh framework. Enriches the command line interface environment with sane defaults, aliases, functions, auto completion, and prompt themes.
- Anonymous Pro - A family of four fixed-width fonts designed with coding in mind.
- DejaVu Sans Mono - A font family based on the Vera Fonts.
- Hack - Hack is hand groomed and optically balanced to be your go-to code face.
- Inconsolata - A monospace font, designed for code listings and the like.
- Input - A flexible system of fonts designed specifically for code.
- Meslo - Customized version of Apple's Menlo font.
- Powerline Fonts - Repo of patched fonts for the Powerline plugin.
- Source Code Pro - A monospaced font family for user interfaces and coding environments.
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.