da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# bash compatibility startup script
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Author:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Karsten Fleischer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Omnium Software Engineering
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# An der Luisenburg 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# D-51379 Leverkusen
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Germany
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# <K.Fleischer@omnium.de>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias declare=typeset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinnameref FUNCNAME=.sh.fun
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger SHLVL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexport SHLVL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinSHLVL+=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ ! $EUID ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen EUID=$(id -u)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin readonly EUID
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ ! $UID ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen UID=$(id -u)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin readonly UID
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinreadonly SHELLOPTS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif ! shopt -qo restricted; then
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin IFS=:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for i in $SHELLOPTS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ -n "$i" ]] && set -o $i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset IFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction SHELLOPTS.get
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin .sh.value=$(shopt -so)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin .sh.value=${.sh.value//+([[:space:]])on*([[:space:]])/:}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin .sh.value=${.sh.value%:}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset -A GROUPS $(id -G)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction GROUPS.set
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction GROUPS.unset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset -f GROUPS.set
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset -f GROUPS.unset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -A DIRSTACK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction DIRSTACK.get
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set -A .sh.value $(dirs)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction DIRSTACK.set
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin integer index
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin index=_push_max-.sh.subscript
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( index == _push_max || index < _push_top )) && return
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _push_stack[index]=${.sh.value}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction DIRSTACK.unset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset -f DIRSTACK.get
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset -f DIRSTACK.set
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset -f DIRSTACK.unset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction PS1.set
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset prefix remaining=${.sh.value} var= n= k=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while [[ $remaining ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do prefix=${remaining%%'\'*}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin remaining=${remaining#$prefix}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var+="$prefix"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ${remaining:1:1} in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t) var+="\$(printf '%(%H:%M:%S)T')";;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin d) var+="\$(printf '%(%a %b:%e)T')";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n) var+=$'\n';;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s) var+=ksh;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin w) var+="\$(pwd)";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin W) var+="\$(basename \"\$(pwd)\")";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u) var+=$USER;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin h) var+=$(hostname -s);;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin '#') var+=!;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !) var+=!;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin @) var+="\$(printf '%(%I:%M%p)T')";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin '$') if (( $(id -u) == 0 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then var+='#'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else var+='$'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin '\') var+='\\';;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin '['|']') ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [0-7]) case ${remaining:1:3} in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [0-7][0-7][0-7])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin k=4;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [0-7][0-7])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin k=3;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) k=2;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eval n="\$'"${remaining:0:k}"'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var+=$n
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin remaining=${remaining:k}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) var+='\'${remaining:0:2};;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin remaining=${remaining:2}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin .sh.value=$var
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction logout
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if shopt -q login_shell; then
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print ${BASH##*/}: $0: not login shell: use 'exit' >&2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinPS1="bash$ "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction source
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ! shopt -qpo posix; then
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unset OPATH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset OPATH=$PATH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset PATH=$PATH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if shopt -q sourcepath; then
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PATH=$OPATH:.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PATH=.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin . "$@"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunalias .
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias .=source
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias enable=builtin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction help
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset b cmd usage try_cmd man
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function has_help_option
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $1 == @(''|/*|:|echo|false|true|login|test|'[') ]] && return 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A short_use=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [echo]='Usage: echo [ options ] [arg]...'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [:]='Usage: : ...'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [true]='Usage: true ...'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [false]='Usage: false ...'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [login]='Usage: login [-p] [name]'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ['[']='Usage: [ EXPRESSION ] | [ OPTION'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [test]='Usage: test EXPRESSION | test'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b=$(builtin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (( $# == 0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then print 'The following is the current list of built-in commands:'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r $'Type help *name* for more information about name\n'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for cmd in $b
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do if has_help_option $cmd
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then usage=$($cmd --short 2>&1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- "${usage:7}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else print -r -- ${short_use[$cmd]:7}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin b=${b/'['/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin man=--man
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $1 == -s ]] && man=--short && shift
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for try_cmd
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do if has_help_option $try_cmd
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then if [[ $try_cmd == @(${b//$'\n'/'|'}) ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then $try_cmd $man
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else man $try_cmd
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin elif [[ $man == '--short' ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then print -r -- ${short_use[$try_cmd]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else man $try_cmd
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction cd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local msg
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local args
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local a
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local ret
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ! shopt -q cdable_vars; then
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command cd "$@"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin msg=$(command cd "$@" 2>&1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ret=$?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ $ret != 0 ]]; then
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $i in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin -*) args="$args $i" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */*) args="$args $i" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) eval a="$"$i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ -n $a ]]; then args="$args $a"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else args="$args $i"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command cd $args
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -- $msg
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return $ret
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset BASH=$0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin! shopt -qo posix && HISTFILE=~/.bash_history
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinHOSTNAME=$(hostname)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinnameref BASH_SUBSHELL=.sh.subshell