This is in response to #3360.
Basically this changes two things:
- It prints out `Running: chsh -s /bin/zsh` right before running `chsh` so if that fails the user can fix the problem and copy-paste, try again.
- If zsh is not installed it tells the user this and then instructs the user to install zsh then run `` chsh -s `which zsh` `` afterwards.
In the latter case it exits afterwards to prevent the next step from failing, i.e. `env zsh`.
This could be improved on by restructuring the logic further and bailing out earlier when `zsh` is not installed, similar to how it handles `git` not being available. However, this is still better than the current behavior of `chsh` failing and the install stopping in the middle:
```
$ curl -L http://install.ohmyz.sh | sh
[...]
Cloning Oh My Zsh...
Cloning into '/home/user/.oh-my-zsh'...
[...]
Looking for an existing zsh config...
Using the Oh My Zsh template file and adding it to ~/.zshrc
Copying your current PATH and adding it to the end of ~/.zshrc for you.
Time to change your default shell to zsh!
chsh: option requires an argument -- 's'
Usage: chsh [options] [LOGIN]
Options:
-h, --help display this help message and exit
-s, --shell SHELL new login shell for the user account
```
The intention of the redirection to /dev/null is to hide the output
'hash: no such command: git' since we rely on the exit status.
However, the output goes to stderr, so it's stderr that needs to be
redirected. For completeness, we redirect both stderr and stdout using
'2>&1'.
Example:
[~]$ hash git > /dev/null
[~]$ PATH=''
[~]$ hash git > /dev/null
hash: no such command: git
[~]$ hash git > /dev/null 2>&1
[~]$
Although the zshrc template adds a PATH= string, this is overwritten by the installer script.
This allows it to be placed anywhere in the file instead of having to append at the end.