In the Terminal preferences, I'm able to configure the Terminal to "Open shells with:" -> "Command (complete path):" /opt/local/bin/bash.

What options is the terminal passing when invoking this command? Terminal appears to run each shell as a login shell, so I'm assuming --login is being passed?

Is there any Apple documentation that gives an overview of exactly what is being run when you open a terminal window?

up vote 2 down vote accepted

No arguments are passed. The terminal runs login -pfq $USER $PROGRAM, which in turn runs the specified program. login signals to the program that it is a login shell by prepending a - to argv[0] (the program name).

For the default shell, Terminal actually does something different. It invokes login -pfl $USER /bin/bash -c exec -la bash /bin/bash, where the -l option to login tells it not to run the command as login shell, while the -l option to exec tells it to run its argument as a login shell (by adding the dash). The reason while this is done is that login also sets the current directory to the user's home directory when it runs a program as a login shell, while exec doesn't. This allows the Terminal to open shells in the same current directory as the current tab, without login setting it back to the home directory.

  • When I change the terminal preferences to /opt/local/bin/bash, how does login -pfq $USER $PROGRAM change? Just so I understand your first paragraph, do you mean Terminal runs login -pfq cwilson /opt/local/bin/-bash? – cdwilson Jan 3 '14 at 2:18
  • No, the terminal runs login -pfq cwilson /opt/local/bin/bash. Then login executes bash, but passes -bash in argv[0]. – LaC Jan 15 '14 at 8:16

The command:

/opt/local/bin/bash

essentially instructs Terminal.app to load an interactive bash shell (the path for your example is likely the macports version). Initially when you open Terminal it starts a login shell session (in bash). Login shells can read files such as ~/.profile, ~/.bash_profile that setup environment variables for your session, so what is being run is mostly indicative of what is configured within those files.

In general, by default when opening a bash shell from Terminal these things would be run:

Processes

bash
login

Open Files and Ports

/bin/bash
/usr/lib/dyld
/private/var/db/dyld/dyld_shared_cache_x86_64
/dev/ttys000 

More Information:

Official Bash Website

Apple Man Page: bash(1)

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.