# # vim:filetype=sh: # .bashrc with functions for non- and interactive and login shells # current functions are only adding/inserting to $env, and PATH, etc. # construction ## doc: check if executable exists _exists() { [ -n "$1" ] && type -P "$1" &> /dev/null } ## doc: check if $DISPLAY isn't pointing to a remote server _check_if_remote_display() { local d="${DISPLAY%.[0-9]*}" local hn="${HOSTNAME%%.*}" if [ -n "${d##:*}" ]; then ## hostname set if [ -z "${d##/*}" ]; then ## unix socket return 0 fi if [ -n "${d##localhost*}" ] && [ -n "${d##$hn*}" ]; then ## not set to localhost or $hostname return 1 fi fi ## localhost, but probably tunneled if [ "${d##*:}" -ge 10 ]; then return 1 fi ## ok return 0 } ## doc: convert text (xh ym zs) to seconds _str2time() { echo $(($(echo " $*" | sed -e 's/s/ * 1 +/g' -e 's/m/ * 60 +/g' \ -e 's/h/ * 3600 +/g') + 0)) } ## doc: check if program/pid exists running() { kill -0 $* &> /dev/null } ## doc: repeat n.m ...: repeat execution n times (in m intervals) repeat() { local n t c n="$1" shift if [ -z "${n##*.*}" ]; then t=$(_str2time ${n##*.}) n="${n%%.*}" else t=0 fi while [ -z "$n" ] || [ "$((n--))" -gt 0 ]; do "$@" sleep $t done } ## doc: retry ...: execute command, and re-execute until it succeeds retry() { local cmd="$1" shift if [ -z "$cmd" ]; then echo "retry cmd [args]" 1>&2 return 1 fi if ! type "$cmd" &> /dev/null; then echo "can't find command $cmd" 1>&2 return 1 fi while ! "$cmd" "$@"; do sleep 1; done } ## doc: define $I_ARCH, $I_PREFIX_NOARCH, $I_PREFIX_ARCH depending on machine getarch() { local arch u ## don't redo [ -z "$I_ARCH" ] || return 0 for u in -m -i -p; do arch=$(uname $u 2>/dev/null) [ -n "$arch" ] && [ "$arch" != unknown ] && break done unset I_ARCH_EXTRA case "$arch" in i[3456]86) arch=i386 ;; x86_64) export I_ARCH_EXTRA=i386 ;; ?ower*64|ppc64) arch=ppc64 export I_ARCH_EXTRA=ppc ;; ?ower*|ppc) arch=ppc ;; esac export I_ARCH=$arch I_PREFIX_NOARCH=$HOME/opt/noarch \ I_PREFIX_ARCH=$HOME/opt/$arch } ## doc: rescan opt dir and define paths repath() { envappend PATH /usr/local/bin /usr/bin /bin envappend PATH /usr/local/sbin /usr/sbin /sbin [ -n "$PATH_LOCAL" ] && envinsert PATH "${PATH_LOCAL[@]}" getarch addarch noarch $I_ARCH_EXTRA $I_ARCH addjava /usr/java/{default,latest,jdk,jre}* } ## environment support functions envisin() { local str str=":$1:" [ -z "${str%%*:$2:*}" ] } envput() { local env check new where old sep arg # args where="$1" env="$2" shift 2 new="" old=":${!env}:" for arg; do [ -d "$arg" ] || continue ## remove from old old="${old//:$arg:/:}" ## add to new, if not yet in new envisin "$new" "$arg" || new="${new:+$new:}$arg" done #until [ "${old/#:}" = "$old" ]; do old="${old/#:}"; done #until [ "${old/%:}" = "$old" ]; do old="${old/%:}"; done if [ -n "$new" ]; then old="${old/#:}" old="${old/%:}" if [ "$where" = after ]; then eval "$env"="${old:+$old:}$new" else eval "$env"="$new${old:+:$old}" fi export $env fi } ## doc: insert path in environment variable envinsert() { envput before "$@" } ## doc: append path to environment variable envappend() { envput after "$@" } ## scan architecture-dependent opt dir addarch() { local arch dir for arch; do [ -d "$HOME/opt/$arch" ] || continue for dir in $HOME/opt/$arch/*; do [ -d "$dir" ] || continue [ -e "$dir/.noauto" ] && continue envinsert PATH "$dir"/{bin,sbin} envinsert PERL5LIB "$dir"/{share,lib{64,}}/perl5{/site_perl,} envinsert CPATH "$dir"/include envinsert LD_LIBRARY_PATH "$dir"/lib{64,} envinsert LIBRARY_PATH "$dir"/lib{64,} envinsert PKG_CONFIG_PATH "$dir"/lib{64,}/pkgconfig envinsert PYTHONPATH "$dir"/lib{64,}/python* \ "$dir"/lib{64,}/python*/site-packages done done export PATH } ## search for java addjava() { local dir javac java javac="" java="" for dir; do if [ -e "$dir"/bin/javac -a -z "$javac" ]; then javac="$dir" fi if [ -e "$dir"/bin/java -a -z "$java" ]; then java="$dir" fi done if [ -n "$javac" ]; then export JAVA_HOME="$javac" envinsert PATH "$javac/bin" elif [ -n "$java" ]; then export JAVA_HOME="$java" envinsert PATH "$java/bin" fi }