To prefer Terminal to open .sh files — using the defaults command, without using Finder
In most cases, all that's required should be possible from the command line …
Preparation
Two commands:
defaults read com.apple.LaunchServices | grep -B 1 -A 3 public.shell-script
defaults read com.apple.LaunchServices | grep -B 1 -A 4 "LSHandlerContentTag = sh;"
If either command reveals an existing preference
Use Xcode or any other suitable property list editor to remove the relevant dictionary from the LSHandlers
key within the following file:
~/Library/Preferences/com.apple.LaunchServices.plist
Hints:
Adding to LaunchServices preferences, for Terminal to view and edit .sh files
Two one-line commands.
Depending on your requirements, the first command alone may suffice:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "public.shell-script"; LSHandlerRoleViewer = "com.apple.Terminal"; LSHandlerRoleEditor = "com.apple.Terminal"; }'
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentTag = "sh"; LSHandlerContentTagClass = "public.filename-extension"; LSHandlerRoleViewer = "com.apple.Terminal"; LSHandlerRoleEditor = "com.apple.Terminal"; }'
For the new preferences to be respected
Modifications to the user domain persistence layer of Launch Services must be acknowledged. For this, least disruptive to the end user will be:
- a restart of the operating system.
From the command line, if immediate restart is acceptable:
sudo shutdown -r now
Background
Understanding Terminal.app support for .sh (public.shell-script)
Consider the result of the following command:
defaults read /Applications/Utilities/Terminal.app/Contents/Info
Terminal aside for a moment: it's sometimes inappropriate (or simply worthless) to force opening of a document type, by an app that is designed without support for that type.
For Terminal, I imagine no harm in handling the public.shell-script
type.