MIAOU-BASH is a collection of settings and helpers for leveraging BASH. Developer-friendly, it may be used as solo package with or without the miaou project.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
7.4 KiB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
  1. #!/bin/bash
  2. function __prompt_command {
  3. local EXIT="$?" # This needs to be first
  4. local R='\[\e[0m\]'
  5. local Red='\[\e[31m\]'
  6. local Gre='\[\e[32m\]'
  7. local Yel='\[\e[33m\]'
  8. local Blu='\[\e[34m\]'
  9. local Cya='\[\e[36m\]'
  10. local Mag='\[\e[95m\]'
  11. local Gra='\[\e[90m\]'
  12. # set xterm title
  13. echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
  14. PS1=''
  15. if [[ -n ${container_hostname:-} ]]; then
  16. PS1+="${Gra}[LXC:${R}"
  17. local host
  18. host=$(builtin echo $container_hostname | tr ' ' ':')
  19. case ${host:0:4} in
  20. 'beta')
  21. PS1+="${Yel}"
  22. ;;
  23. 'prod')
  24. PS1+="${Red}"
  25. ;;
  26. *) ;;
  27. esac
  28. PS1+="${host}${Gra}] "
  29. fi
  30. if [[ "$(id -u)" -eq 0 ]]; then
  31. PS1+="$Yel\u$R"
  32. PROMPT='$'
  33. else
  34. PS1+="$Gre\u$R"
  35. PROMPT='#'
  36. fi
  37. PS1+="${Gra}@"
  38. case ${HOSTNAME:0:4} in
  39. 'beta')
  40. PS1+="${Yel}"
  41. ;;
  42. 'prod')
  43. PS1+="${Red}"
  44. ;;
  45. *)
  46. PS1+="${R}"
  47. ;;
  48. esac
  49. PS1+="\h"
  50. local pwd='~'
  51. [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/}
  52. PS1+=" ${Cya}${pwd}$(__vte_osc7)${R}"
  53. if hash git 2>&-; then
  54. # git command exists
  55. if git rev-parse --git-dir >/dev/null 2>&1; then
  56. # current dir is version controlled
  57. local branch tag_release dirty
  58. branch=$(git branch 2>/dev/null | grep -e ^* | cut -d ' ' -f2)
  59. PS1+=" ${R}[${Mag}${branch}${R}|"
  60. tag_release=$(git describe --tags 2>/dev/null | cut -d'-' -f1)
  61. dirty=$(git status -s | wc -l)
  62. if [[ $dirty -ne 0 ]]; then
  63. PS1+="⚡|${tag_release}${Yel}…$dirty"
  64. else
  65. local ahead=$(git rev-list --branches --not --remotes | wc -l)
  66. if [[ $ahead -ne 0 ]]; then
  67. PS1+="⚡|${tag_release}${Cya}↑${ahead}"
  68. else
  69. if [[ -z $tag_release ]]; then
  70. PS1+="${Blu}✔"
  71. else
  72. PS1+="${Gre}✔${R}|${Blu}${tag_release}"
  73. fi
  74. fi
  75. fi
  76. PS1+="${R}]"
  77. fi
  78. fi
  79. if [ $EXIT != 0 ]; then
  80. PS1+="$Mag" # Add red if exit code non 0
  81. else
  82. PS1+="$Gra"
  83. fi
  84. PS1+=" $PROMPT ${R}"
  85. }
  86. function __vte_osc7 {
  87. # HINT: special character vte to get TILIX show proper hostname and pwd
  88. # Use \[...\] around the parts of PS1 that have length 0.
  89. # https://unix.stackexchange.com/questions/28827/why-is-my-bash-prompt-getting-bugged-when-i-browse-the-history#28828
  90. VTE_INFO="${HOSTNAME:-}"
  91. if [[ -n ${container_hostname:-} ]]; then
  92. local host
  93. host=$(builtin echo $container_hostname | tr ' ' ':')
  94. VTE_INFO="$host:$HOSTNAME"
  95. fi
  96. printf "\[\033]7;file://%s%s\a\]" "${VTE_INFO}" "$(__vte_urlencode "${PWD}")"
  97. }
  98. function __vte_urlencode {
  99. # This is important to make sure string manipulation is handled
  100. # byte-by-byte.
  101. LC_ALL=C
  102. str="$1"
  103. while [ -n "$str" ]; do
  104. safe="${str%%[!a-zA-Z0-9/:_\.\-\!\'\(\)~]*}"
  105. printf "%s" "$safe"
  106. str="${str#"$safe"}"
  107. if [ -n "$str" ]; then
  108. printf "%%%02X" "'$str"
  109. str="${str#?}"
  110. fi
  111. done
  112. }
  113. ###------
  114. ### MAIN
  115. ###------
  116. # If not running interactively, don't do anything
  117. case $- in
  118. *i*) ;;
  119. *) return ;;
  120. esac
  121. # don't put duplicate lines or lines starting with space in the history.
  122. HISTCONTROL=ignoreboth
  123. # append to the history file, don't overwrite it
  124. shopt -s histappend
  125. # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
  126. HISTSIZE=10000
  127. HISTFILESIZE=20000
  128. # check the window size after each command and, if necessary,
  129. # update the values of LINES and COLUMNS.
  130. shopt -s checkwinsize
  131. # make less more friendly for non-text input files, see lesspipe(1)
  132. [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
  133. # set a fancy prompt (non-color, unless we know we "want" color)
  134. case "$TERM" in
  135. xterm-color | *-256color)
  136. color_prompt=yes
  137. export COLOR_OPTIONS=' --color=auto'
  138. ;;
  139. esac
  140. export LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.sql.gz=01;35:*.mariadb.gz=01;35:*.postgres.gz=01;35:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"
  141. export LESS="r"
  142. # enable programmable completion features (you don't need to enable
  143. # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
  144. # sources /etc/bash.bashrc).
  145. if ! shopt -oq posix; then
  146. if [ -f /usr/share/bash-completion/bash_completion ]; then
  147. . /usr/share/bash-completion/bash_completion
  148. elif [ -f /etc/bash_completion ]; then
  149. . /etc/bash_completion
  150. fi
  151. fi
  152. # prevent CTRL+S to freeze in vim, CTRL+Q to unfreeze!
  153. stty -ixon
  154. PROMPT_COMMAND='__prompt_command' # Func to gen PS1 after CMDs
  155. MIAOU_BASH_DIR=/opt/miaou-bash
  156. # ALIASES
  157. alias sudo='sudo ' # smart sudo alias trick!
  158. alias ls='ls $COLOR_OPTIONS -h'
  159. alias ll='ls $COLOR_OPTIONS -lh'
  160. alias la='ls $COLOR_OPTIONS -lah'
  161. alias ltr='ls $COLOR_OPTIONS -ltrh'
  162. alias l=ls
  163. alias cd..='cd ..'
  164. alias ..=cd..
  165. alias grep='grep $COLOR_OPTIONS'
  166. alias fgrep='fgrep $COLOR_OPTIONS'
  167. alias egrep='egrep $COLOR_OPTIONS'
  168. alias transfer_cp='rsync -a --info=progress2 --no-inc-recursive'
  169. # shellcheck disable=SC2142
  170. alias ssu="ss -ntelp | perl -pne 'if(/uid:(\\d+)/){@a=getpwuid(\$1);s/uid:(\\d+)/user:\$a[0]/}' | awk '{ print \$4 \"\\t\" \$7 \"\\t\" \$6 }'"
  171. # shellcheck disable=SC2142
  172. alias ssu4="ss -ntel4p | perl -pne 'if(/uid:(\\d+)/){@a=getpwuid(\$1);s/uid:(\\d+)/user:\$a[0]/}' | awk '{ print \$4 \"\\t\\t\" \$7 \"\\t\\t\" \$6 }'"
  173. # Alias definitions.
  174. # You may want to put all your additions into a separate file like
  175. # ~/.bash_aliases, instead of adding them here directly.
  176. # See /usr/share/doc/bash-doc/examples in the bash-doc package.
  177. if [ -f "$HOME/.bash_aliases" ]; then
  178. . "$HOME/.bash_aliases"
  179. fi
  180. # Add path to any tools folder in /opt/miaou-*
  181. for i in {/opt,$HOME}/miaou-*/tools; do
  182. if [ -d "$i" ]; then
  183. PATH=$PATH:$i
  184. fi
  185. done
  186. ## Add path for TOOLBOX if any
  187. if [ -d "/TOOLBOX" ]; then
  188. PATH=$PATH:/TOOLBOX
  189. fi