Using the Unix Shell on Mac OS X

Default Shell | Clipboard | Environment Settings

I use Terminal.app, though there are other terminal emulation programs available. Additional shell tips.

Default Shell

The default shell program can be set in Terminal.app, though this is a poor method, as other terminal programs will likely not honor this setting. Use chsh(1) (or a directory editor if the system is slaved to some directory service) to update the shell. Custom shells may result in an error:

chsh: …: non-standard shell

This can be corrected by adding the path to the custom shell in the /etc/shells file.

Another trick is to exec zsh from a shell startup file that is read by whatever the default shell is, usually ~/.profile. However, this requires safeguards to ensure that the new shell does not again read ~/.profile and thereby create an infinite exec loop.

Clipboard

Use the pbcopy and pbpaste commands to interact with the clipboard.

$ echo /tmp | pbcopy
$ ls -d `pbpaste`
/tmp

On some versions of Mac OS X, the Apple supplied screen(1) program would cause problems for these utilities. Upgrade to the latest OS X, or compile screen manually (or via a ports or package system).

Environment Settings

Sharing process environment variables with other programs (such as BBEdit) on Mac OS X is difficult. Environment variables for all programs can be set in the ~/.MacOSX/environment.plist file, though this requires a logout for changes to take effect. If this is a problem, place a shell script wrapper between the program being run and the caller. For example, a BBEdit filter or Xcode user script could first run:

#!/bin/zsh
exec the_real_program "$@"

As this would set any shell configuration listed in the ~/.zshenv file. The shell script wrapper could also source environment settings from a known location (. ~/.somerc). This avoids the need to duplicate the shell environment into the environment.plist file, and offers dynamic updates should the environment settings need to be changed without logging out.