Updated Xcode command line tools installer script now available
A while back, I developed a script that will download and install the Xcode Command Line Tools on Macs running 10.7.x and higher.
Most of the time it works fine. However, starting with macOS Sierra and continuing on with macOS High Sierra, I occasionally ran into an odd problem. Apple would sometimes have both the latest available Xcode Command Line Tools installer and the just-previous version available on Apple’s Software Update feed.
The original script was written with the assumption that there would only be one qualifying Xcode Command Line Tools install option available at any one time. When more than one is available, the script isn’t able to correctly identify which Xcode Command Line Tools it should be installing. The result is that the script ends without installing anything.
Apple usually removes the previous version from the Software Update feed within a few days, which allows the script to work normally again. But when it happened this time, I decided to update the script to hopefully fix this issue once and for all. For more details, please see below the jump.
The fix was to add the following section to the script:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Check to see if the softwareupdate tool has returned more than one Xcode | |
# command line tool installation option. If it has, use the last one listed | |
# as that should be the latest Xcode command line tool installer. | |
if (( $(grep -c . <<<"$cmd_line_tools") > 1 )); then | |
cmd_line_tools_output="$cmd_line_tools" | |
cmd_line_tools=$(printf "$cmd_line_tools_output" | tail -1) | |
fi |
This section helps identify if Apple’s softwareupdate command line tool has returned more than one Xcode command line tool installation option. If more than one is available, the script will identify the last one listed and install that one.
Note: It is possible that a future release by Apple could result in the latest Xcode command line tool installer not being the one listed. This design decision was based on observation of past results.
The updated script is available below. It’s also available from my Github repo from the following link:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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" | |
# Identify the correct update in the Software Update feed with "Command Line Tools" in the name for the OS version in question. | |
if [[ "$osx_vers" -gt 9 ]]; then | |
cmd_line_tools=$(softwareupdate -l | awk '/\*\ Command Line Tools/ { $1=$1;print }' | grep "$osx_vers" | sed 's/^[[ \t]]*//;s/[[ \t]]*$//;s/*//' | cut -c 2-) | |
elif [[ "$osx_vers" -eq 9 ]]; then | |
cmd_line_tools=$(softwareupdate -l | awk '/\*\ Command Line Tools/ { $1=$1;print }' | grep "Mavericks" | sed 's/^[[ \t]]*//;s/[[ \t]]*$//;s/*//' | cut -c 2-) | |
fi | |
# Check to see if the softwareupdate tool has returned more than one Xcode | |
# command line tool installation option. If it has, use the last one listed | |
# as that should be the latest Xcode command line tool installer. | |
if (( $(grep –c . <<<"$cmd_line_tools") > 1 )); then | |
cmd_line_tools_output="$cmd_line_tools" | |
cmd_line_tools=$(printf "$cmd_line_tools_output" | tail -1) | |
fi | |
#Install the command line tools | |
softwareupdate -i "$cmd_line_tools" –verbose | |
# 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 |
Just wondering if there is a new version of this script for Monterey / Ventura Apple Silicon Macs.