summaryrefslogtreecommitdiff
path: root/oh-my-zsh.sh
diff options
context:
space:
mode:
authorMarc Cornellà <hello@mcornella.com>2021-10-04 10:34:13 +0200
committerGitHub <noreply@github.com>2021-10-04 10:34:13 +0200
commit7152a942802b01cb74d7c0b99f3106f8af17439d (patch)
tree5b87101b45e03d1aa1d5a61aebd78e7f43505c84 /oh-my-zsh.sh
parentc6c364317d1762aafc575951c08c2cccce76fffa (diff)
downloadzsh-7152a942802b01cb74d7c0b99f3106f8af17439d.tar.gz
zsh-7152a942802b01cb74d7c0b99f3106f8af17439d.tar.bz2
zsh-7152a942802b01cb74d7c0b99f3106f8af17439d.zip
feat(init): show error and process tree if OMZ is loaded from non-zsh shells (#10234)
Diffstat (limited to 'oh-my-zsh.sh')
-rw-r--r--oh-my-zsh.sh38
1 files changed, 35 insertions, 3 deletions
diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh
index bf5902fc8..c389fc963 100644
--- a/oh-my-zsh.sh
+++ b/oh-my-zsh.sh
@@ -1,8 +1,40 @@
# Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here)
[ -n "$ZSH_VERSION" ] || {
- # ANSI (\033[<code>m): 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red
- printf "\033[1;31mERROR:\033[22m Oh My Zsh can't be loaded from: \033[1m${0#-}\033[22m. " >&2
- printf "You need to run \033[1;4mzsh\033[22;24m instead.\033[0m\n" >&2
+ # ANSI formatting function (\033[<code>m)
+ # 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
+ f() {
+ [ $# -gt 0 ] || return
+ IFS=";" printf "\033[%sm" $*
+ }
+ # If stdout is not a terminal ignore all formatting
+ [ -t 1 ] || f() { :; }
+
+ ptree() {
+ # Get process tree of the current process
+ pid=$$; pids="$pid"
+ while [ ${pid-0} -ne 1 ] && ppid=$(ps -e -o pid,ppid | awk "\$1 == $pid { print \$2 }"); do
+ pids="$pids $pid"; pid=$ppid
+ done
+
+ # Show process tree
+ case "$(uname)" in
+ Linux) ps -o ppid,pid,command -f -p $pids 2>/dev/null ;;
+ Darwin|*) ps -o ppid,pid,command -p $pids 2>/dev/null ;;
+ esac
+
+ # If ps command failed, try Busybox ps
+ [ $? -eq 0 ] || ps -o ppid,pid,comm | awk "NR == 1 || index(\"$pids\", \$2) != 0"
+ }
+
+ {
+ shell=$(ps -o pid,comm | awk "\$1 == $$ { print \$2 }")
+ printf "$(f 1 31)Error:$(f 22) Oh My Zsh can't be loaded from: $(f 1)${shell}$(f 22). "
+ printf "You need to run $(f 1)zsh$(f 22) instead.$(f 0)\n"
+ printf "$(f 33)Here's the process tree:$(f 22)\n\n"
+ ptree
+ printf "$(f 0)\n"
+ } >&2
+
return 1
}