@ -1,44 +1,78 @@
main( ) {
# Use colors, but only if connected to a terminal, and that terminal
# supports them.
if which tput >/dev/null 2>& 1; then
ncolors = $( tput colors)
fi
if [ -t 1 ] && [ -n " $ncolors " ] && [ " $ncolors " -ge 8 ] ; then
#!/bin/sh
#
# This script should be run via curl:
# sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
# or wget:
# sh -c "$(wget -qO- https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
#
# As an alternative, you can first download the install script and run it afterwards:
# wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh
# sh install.sh
#
# You can tweak the install behavior by setting variables when running the script. For
# example, to change the path to the Oh My Zsh repository:
# ZSH=~/.zsh sh install.sh
#
# Respects the following environment variables:
# ZSH - path to the Oh My Zsh repository folder (default: $HOME/.oh-my-zsh)
# REPO - name of the GitHub repo to install from (default: robbyrussell/oh-my-zsh)
# REMOTE - full remote URL of the git repo to install (default: GitHub via HTTPS)
# BRANCH - branch to check out immediately after install (default: master)
#
# Other options:
# CHSH - 'no' means the installer will not change the default shell (default: yes)
# RUNZSH - 'no' means the installer will not run zsh after the install (default: yes)
#
# You can also pass some arguments to the install script to set some these options:
# --skip-chsh: has the same behavior as setting CHSH to 'no'
# --unattended: sets both CHSH and RUNZSH to 'no'
# For example:
# sh install.sh --unattended
#
set -e
# Default settings
ZSH = ${ ZSH :- ~/.oh-my-zsh }
REPO = ${ REPO :- robbyrussell /oh-my-zsh }
REMOTE = ${ REMOTE :- https : //github.com/ ${ REPO } .git }
BRANCH = ${ BRANCH :- master }
# Other options
CHSH = ${ CHSH :- yes }
RUNZSH = ${ RUNZSH :- yes }
command_exists( ) {
command -v " $@ " >/dev/null 2>& 1
}
error( ) {
echo ${ RED } " Error: $@ " ${ RESET } >& 2
}
# Set up color sequences
setup_color( ) {
ncolors = $( tput colors 2>/dev/null) || ncolors = 0
# Only use colors if connected to a terminal that supports them
if [ -t 1 ] && [ $ncolors -ge 8 ] ; then
RED = " $( tput setaf 1) "
GREEN = " $( tput setaf 2) "
YELLOW = " $( tput setaf 3) "
BLUE = " $( tput setaf 4) "
BOLD = " $( tput bold) "
NORMAL = " $( tput sgr0) "
RESET = " $( tput sgr0) "
else
RED = ""
GREEN = ""
YELLOW = ""
BLUE = ""
BOLD = ""
NORMAL = ""
fi
# Only enable exit-on-error after the non-critical colorization stuff,
# which may fail on systems lacking tput or terminfo
set -e
if ! command -v zsh >/dev/null 2>& 1; then
printf " ${ YELLOW } Zsh is not installed! ${ NORMAL } Please install zsh first!\n "
exit
fi
if [ ! -n " $ZSH " ] ; then
ZSH = ~/.oh-my-zsh
fi
if [ -d " $ZSH " ] ; then
printf " ${ YELLOW } You already have Oh My Zsh installed. ${ NORMAL } \n "
printf " You'll need to remove $ZSH if you want to re-install.\n "
exit
RED = $( printf '\033[31m' )
GREEN = $( printf '\033[32m' )
YELLOW = $( printf '\033[33m' )
BLUE = $( printf '\033[34m' )
BOLD = $( printf '\033[1m' )
RESET = $( printf '\033[m' )
fi
}
setup_ohmyzsh( ) {
# Prevent the cloned repository from having insecure permissions. Failing to do
# so causes compinit() calls to fail with "command not found: compdef" errors
# for users with insecure umasks (e.g., "002", allowing group writability). Note
@ -46,69 +80,193 @@ main() {
# precedence over umasks except for filesystems mounted with option "noacl".
umask g-w,o-w
printf " ${ BLUE } Cloning Oh My Zsh... ${ NORMAL } \n "
command -v git >/dev/null 2>& 1 || {
echo "Error: git is not installed"
echo " ${ BLUE } Cloning Oh My Zsh... ${ RESET } "
command_exists git || {
error "git is not installed"
exit 1
}
# The Windows (MSYS) Git is not compatible with normal use on cygwin
if [ " $OSTYPE " = cygwin ] ; then
if git --version | grep msysgit > /dev/null; then
echo "Error: Windows/MSYS Git is not supported on Cygwin"
echo "Error: Make sure the Cygwin git package is installed and is first on the path"
if [ " $OSTYPE " = cygwin ] && git --version | grep -q msysgit; then
error "Windows/MSYS Git is not supported on Cygwin"
error "Make sure the Cygwin git package is installed and is first on the \$PATH"
exit 1
fi
fi
env git clone --depth= 1 https://github.com/robbyrussell/oh-my-zsh.git " $ZSH " || {
printf "Error: git clone of oh-my-zsh repo failed\n "
git clone --depth= 1 --branch " $BRANCH " " $REMOTE " " $ZSH " || {
error "git clone of oh-my-zsh repo failed "
exit 1
}
echo
}
setup_zshrc( ) {
# Keep most recent old .zshrc at .zshrc.pre-oh-my-zsh, and older ones
# with datestamp of installation that moved them aside, so we never actually
# destroy a user's original zshrc
echo " ${ BLUE } Looking for an existing zsh config... ${ RESET } "
printf " ${ BLUE } Looking for an existing zsh config... ${ NORMAL } \n "
# Must use this exact name so uninstall.sh can find it
OLD_ZSHRC = ~/.zshrc.pre-oh-my-zsh
if [ -f ~/.zshrc ] || [ -h ~/.zshrc ] ; then
printf " ${ YELLOW } Found ~/.zshrc. ${ NORMAL } ${ GREEN } Backing up to ~/.zshrc.pre-oh-my-zsh ${ NORMAL } \n " ;
mv ~/.zshrc ~/.zshrc.pre-oh-my-zsh;
if [ -e " $OLD_ZSHRC " ] ; then
OLD_OLD_ZSHRC = " ${ OLD_ZSHRC } - $( date +%Y-%m-%d_%H-%M-%S) "
if [ -e " $OLD_OLD_ZSHRC " ] ; then
error " $OLD_OLD_ZSHRC exists. Can't back up ${ OLD_ZSHRC } "
error "re-run the installer again in a couple of seconds"
exit 1
fi
mv " $OLD_ZSHRC " " ${ OLD_OLD_ZSHRC } "
echo " ${ YELLOW } Found old ~/.zshrc.pre-oh-my-zsh. " \
" ${ GREEN } Backing up to ${ OLD_OLD_ZSHRC } ${ RESET } "
fi
echo " ${ YELLOW } Found ~/.zshrc. ${ RESET } ${ GREEN } Backing up to ${ OLD_ZSHRC } ${ RESET } "
mv ~/.zshrc " $OLD_ZSHRC "
fi
echo " ${ GREEN } Using the Oh My Zsh template file and adding it to ~/.zshrc. ${ RESET } "
printf " ${ BLUE } Using the Oh My Zsh template file and adding it to ~/.zshrc ${ NORMAL } \n "
cp " $ZSH " /templates/zshrc.zsh-template ~/.zshrc
cp " $ZSH /templates/zshrc.zsh-template " ~/.zshrc
sed " /^export ZSH=/ c\\
export ZSH = \" $ZSH \"
" ~/.zshrc > ~/.zshrc-omztemp
mv -f ~/.zshrc-omztemp ~/.zshrc
# If this user's login shell is not already "zsh", attempt to switch.
TEST_CURRENT_SHELL = $( basename " $SHELL " )
if [ " $TEST_CURRENT_SHELL " != "zsh" ] ; then
# If this platform provides a "chsh" command (not Cygwin), do it, man!
if hash chsh >/dev/null 2>& 1; then
printf " ${ BLUE } Time to change your default shell to zsh! ${ NORMAL } \n "
chsh -s $( grep /zsh$ /etc/shells | tail -1)
# Else, suggest the user do so manually.
echo
}
setup_shell( ) {
# Skip setup if the user wants or stdin is closed (not running interactively).
if [ $CHSH = no ] ; then
return
fi
# If this user's login shell is already "zsh", do not attempt to switch.
if [ " $( basename " $SHELL " ) " = "zsh" ] ; then
return
fi
# If this platform doesn't provide a "chsh" command, bail out.
if ! command_exists chsh; then
cat <<-EOF
I can' t change your shell automatically because this system does not have chsh.
${ BLUE } Please manually change your default shell to zsh${ RESET }
EOF
return
fi
echo " ${ BLUE } Time to change your default shell to zsh: ${ RESET } "
# Prompt for user choice on changing the default login shell
printf " ${ YELLOW } Do you want to change your default shell to zsh? [Y/n] ${ RESET } "
read opt
case $opt in
y*| Y*| "" ) echo "Changing the shell..." ; ;
n*| N*) echo "Shell change skipped." ; return ; ;
*) echo "Invalid choice. Shell change skipped." ; return ; ;
esac
# Test for the right location of the "shells" file
if [ -f /etc/shells ] ; then
shells_file = /etc/shells
elif [ -f /usr/share/defaults/etc/shells ] ; then # Solus OS
shells_file = /usr/share/defaults/etc/shells
else
error "could not find /etc/shells file. Change your default shell manually."
return
fi
# Get the path to the right zsh binary
# 1. Use the most preceding one based on $PATH, then check that it's in the shells file
# 2. If that fails, get a zsh path from the shells file, then check it actually exists
if ! zsh = $( which zsh) || ! grep -qx " $zsh " " $shells_file " ; then
if ! zsh = $( grep '^/.*/zsh$' " $shells_file " | tail -1) || [ ! -f " $zsh " ] ; then
error " no zsh binary found or not present in ' $shells_file ' "
error "change your default shell manually."
return
fi
fi
# We're going to change the default shell, so back up the current one
if [ -n $SHELL ] ; then
echo $SHELL > ~/.shell.pre-oh-my-zsh
else
printf "I can't change your shell automatically because this system does not have chsh.\n"
printf " ${ BLUE } Please manually change your default shell to zsh! ${ NORMAL } \n "
fi
fi
printf " ${ GREEN } "
echo ' __ __ '
echo ' ____ / /_ ____ ___ __ __ ____ _____/ /_ '
echo ' / __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \ '
echo '/ /_/ / / / / / / / / / / /_/ / / /_(__ ) / / / '
echo '\____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/ '
echo ' /____/ ....is now installed!'
echo ''
echo ''
echo 'Please look over the ~/.zshrc file to select plugins, themes, and options.'
echo ''
echo 'p.s. Follow us at https://twitter.com/ohmyzsh'
echo ''
echo 'p.p.s. Get stickers, shirts, and coffee mugs at https://shop.planetargon.com/collections/oh-my-zsh'
echo ''
printf " ${ NORMAL } "
env zsh -l
grep " ^ $USER : " /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh
fi
# Actually change the default shell to zsh
if ! chsh -s " $zsh " ; then
error "chsh command unsuccessful. Change your default shell manually."
else
export SHELL = " $zsh "
echo " ${ GREEN } Shell successfully changed to ' $zsh '. ${ RESET } "
fi
echo
}
main( ) {
# Run as unattended if stdin is closed
if [ ! -t 0 ] ; then
RUNZSH = no
CHSH = no
fi
# Parse arguments
while [ $# -gt 0 ] ; do
case $1 in
--unattended) RUNZSH = no; CHSH = no ; ;
--skip-chsh) CHSH = no ; ;
esac
shift
done
setup_color
if ! command_exists zsh; then
echo " ${ YELLOW } Zsh is not installed. ${ RESET } Please install zsh first. "
exit 1
fi
if [ -d " $ZSH " ] ; then
cat <<-EOF
${ YELLOW } You already have Oh My Zsh installed.${ RESET }
You'll need to remove ' $ZSH ' if you want to reinstall.
EOF
exit 1
fi
setup_ohmyzsh
setup_zshrc
setup_shell
printf " $GREEN "
cat <<-'EOF'
__ __
____ / /_ ____ ___ __ __ ____ _____/ /_
/ __ \/ __ \ / __ ` __ \/ / / / /_ / / ___/ __ \
/ /_/ / / / / / / / / / / /_/ / / /_( __ ) / / /
\_ ___/_/ /_/ /_/ /_/ /_/\_ _, / /___/____/_/ /_/
/____/ ....is now installed!
Please look over the ~/.zshrc file to select plugins, themes, and options.
p.s. Follow us on https://twitter.com/ohmyzsh
p.p.s. Get stickers, shirts, and coffee mugs at https://shop.planetargon.com/collections/oh-my-zsh
EOF
printf " $RESET "
if [ $RUNZSH = no ] ; then
echo " ${ YELLOW } Run zsh to try it out. ${ RESET } "
exit
fi
exec zsh -l
}
main
main " $@ "