Skip to content

Instantly share code, notes, and snippets.

@rtrouton
Last active May 30, 2021 12:32
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save rtrouton/f92f263414aaeb946e54 to your computer and use it in GitHub Desktop.
Save rtrouton/f92f263414aaeb946e54 to your computer and use it in GitHub Desktop.
Install Xcode command line tools on 10.7.x - 10.10.x. Tested on 10.7.5, 10.8.5, 10.9.5 and 10.10.2.
#!/bin/bash
# Installing the Xcode command line tools on 10.7.x or higher
osx_vers=$(sw_vers -productVersion | awk -F "." '{print $2}')
cmd_line_tools_temp_file="/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress"
# Installing the latest Xcode command line tools on 10.9.x or higher
if [[ "$osx_vers" -ge 9 ]]; then
# Create the placeholder file which is checked by the softwareupdate tool
# before allowing the installation of the Xcode command line tools.
touch "$cmd_line_tools_temp_file"
# Find the last listed update in the Software Update feed with "Command Line Tools" in the name
cmd_line_tools=$(softwareupdate -l | awk '/\*\ Command Line Tools/ { $1=$1;print }' | tail -1 | sed 's/^[[ \t]]*//;s/[[ \t]]*$//;s/*//' | cut -c 2-)
#Install the command line tools
softwareupdate -i "$cmd_line_tools" -v
# Remove the temp file
if [[ -f "$cmd_line_tools_temp_file" ]]; then
rm "$cmd_line_tools_temp_file"
fi
fi
# Installing the latest Xcode command line tools on 10.7.x and 10.8.x
# on 10.7/10.8, instead of using the software update feed, the command line tools are downloaded
# instead from public download URLs, which can be found in the dvtdownloadableindex:
# https://devimages.apple.com.edgekey.net/downloads/xcode/simulators/index-3905972D-B609-49CE-8D06-51ADC78E07BC.dvtdownloadableindex
if [[ "$osx_vers" -eq 7 ]] || [[ "$osx_vers" -eq 8 ]]; then
if [[ "$osx_vers" -eq 7 ]]; then
DMGURL=http://devimages.apple.com/downloads/xcode/command_line_tools_for_xcode_os_x_lion_april_2013.dmg
fi
if [[ "$osx_vers" -eq 8 ]]; then
DMGURL=http://devimages.apple.com/downloads/xcode/command_line_tools_for_osx_mountain_lion_april_2014.dmg
fi
TOOLS=cltools.dmg
curl "$DMGURL" -o "$TOOLS"
TMPMOUNT=`/usr/bin/mktemp -d /tmp/clitools.XXXX`
hdiutil attach "$TOOLS" -mountpoint "$TMPMOUNT" -nobrowse
# The "-allowUntrusted" flag has been added to the installer
# command to accomodate for now-expired certificates used
# to sign the downloaded command line tools.
installer -allowUntrusted -pkg "$(find $TMPMOUNT -name '*.mpkg')" -target /
hdiutil detach "$TMPMOUNT"
rm -rf "$TMPMOUNT"
rm "$TOOLS"
fi
exit 0
@danielbair
Copy link

This is awesome. The only thing I could recommend is change installer -allowUntrusted -pkg... to sudo installer -allowUntrusted -pkg... and it works great. And if you want to detect if Xcode CL Tools is installed then just run pkgutil --pkgs | grep com.apple | grep CL | grep Tools (I have tested this on 10.7.x, 10.8.x, 10.9.x, 10.10.x, and 10.11.x).

@iancdavidson
Copy link

Fantastically useful script. I noticed a problem running the script on MacOS Sierra unfortunately. Softwareupdate may have changed.
softwareupdate: invalid option -- v

@davidmarcantonio
Copy link

We found dropping the -v from the script makes it work for our Sierra deployments now.

@mike-u
Copy link

mike-u commented Aug 4, 2018

Thanks so much for this! Is there an xcode-select --switch required afterwards?

@scrutinizer11
Copy link

scrutinizer11 commented May 30, 2021

Awesome and thank you. Was going to do it by myself withxcode-select --install because in the majority of use cases the person who's in need of CLI tools has Xcode installed already and this command is the most straightforward approach available. However, to execute it Xcode has to be version 5 or newer: in Xcode 4.x.x for Lion and Mountain Lion there's no --install so I had to figure out how to install them via Terminal for my script. You left me standing and your approach is superseding those commands to install CLI tools that are based just on the version of macOS and Xcode. Thank you. I'll credit you as the one my script was derived from.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment