D1772.bashrc (5696B)
1 #! bash config 2 3 shopt -s extglob 4 #opts=builtin-elapsed 5 #opts=no-timer 6 7 #type=none 8 type=initial 9 #type=initial-prompt 10 #type=final 11 #type=final-prompt 12 13 #type=check-DEBUG-behavior 14 #type=unset-self-func 15 #type=check-bashbug-tmpenv 16 #type=check-unset-trap-DEBUG 17 18 #set -T 19 20 if [[ $type == initial ]]; then 21 source out/ble.sh --attach=none 22 elif [[ $type == initial-prompt ]]; then 23 source out/ble.sh 24 fi 25 26 if [[ ${BLE_VERSION-} && :$opts: == *:builtin-elapsed:* ]]; then 27 ble-import contrib/prompt-elapsed 28 _ps1_time='\q{contrib/elapsed}' 29 elif [[ :$opts: != *:no-timer:* ]]; then 30 function timer_start { 31 #echo $FUNCNAME >/dev/tty 32 timer=${timer:-$SECONDS} 33 } 34 35 function timer_stop { 36 #echo $FUNCNAME >/dev/tty 37 timer_show=$(($SECONDS - $timer)) 38 #timer_show=$(($SECONDS - timer)) 39 unset timer 40 } 41 42 trap 'timer_start "$BASH_COMMAND"' DEBUG 43 44 if [ "$PROMPT_COMMAND" == "" ]; then 45 PROMPT_COMMAND="timer_stop" 46 else 47 PROMPT_COMMAND="$PROMPT_COMMAND; timer_stop" 48 fi 49 50 _ps1_time='${timer_show}s' 51 fi 52 53 case $type in 54 (check-DEBUG-behavior) 55 echo "direct:1" 56 builtin trap -p DEBUG 57 echo "direct:2" 58 59 # Q サブシェルの中でも DEBUG trap の定義を参照できるか? 60 # A 参照できる。 61 echo "subshell:1" 62 echo "[$(builtin trap -p DEBUG)]" 63 echo "subshell:2" 64 65 # Q 関数の中でも DEBUG trap の定義を参照できるか? 66 # A 参照できない。-t を付加していれば見られる。 67 function inside-function { 68 echo "$FUNCNAME:1" 69 builtin trap -p DEBUG 70 echo "$FUNCNAME:2" 71 } >/dev/tty 72 declare -ft inside-function 73 inside-function 74 75 # Q 関数内サブシェルでも DEBUG trap の定義を参照できるか? 76 # A できない。-t を付加していれば見られる。 77 function inside-func-subshell { 78 echo "$FUNCNAME[$(builtin trap -p DEBUG)]" 79 } >/dev/tty 80 declare -ft inside-func-subshell 81 inside-func-subshell 82 83 # Q 関数内 eval でも DEBUG trap の定義を参照できるか? 84 # A できない。-t を付加していれば見られる。 85 function inside-func-eval { 86 echo "$FUNCNAME:1" 87 eval 'builtin trap -p DEBUG' 88 echo "$FUNCNAME:2" 89 } >/dev/tty 90 declare -ft inside-func-eval 91 inside-func-eval 92 93 # Q 関数の更に内側の関数で DEBUG trap の定義を参照できるか? 94 # A できない。外側と内側の両方に -t を指定して初めて見られる。 95 function inside-func-nest/1 { 96 builtin trap -p DEBUG 97 } 98 function inside-func-nest { 99 echo "$FUNCNAME:1" 100 inside-func-nest/1 101 echo "$FUNCNAME:2" 102 } >/dev/tty 103 declare -ft inside-func-nest/1 104 declare -ft inside-func-nest 105 inside-func-nest 106 107 # Q 関数の中でリダイレクトした時に DEBUG trap の定義を参照できるか。 108 # A できない。-t を付加していれば見られる。 109 function inside-func-redir { 110 builtin trap -p DEBUG > a.tmp 111 echo "$FUNCNAME[$(<a.tmp)]" 112 } >/dev/tty 113 declare -ft inside-func-redir 114 inside-func-redir 115 116 # Q 内側の関数から呼び出された後で外側の関数に対して -t 属性を付加して参照できる様になるだろうか。 117 # A ならない。 118 function nest-afterward-trace/1 { 119 declare -ft "${FUNCNAME[1]}" 120 builtin trap -p DEBUG 121 } 122 function nest-afterward-trace { 123 echo "$FUNCNAME:1" 124 nest-afterward-trace/1 125 echo "$FUNCNAME:2" 126 } 127 declare -ft nest-afterward-trace/1 128 nest-afterward-trace 129 130 # Q 内側の関数で set -o functrace を設定して見られる様になるだろうか。 131 # A ならない。 132 function nest-afterward-functrace/1 { 133 set -o functrace 134 builtin trap -p DEBUG 135 set +o functrace 136 } 137 function nest-afterward-functrace { 138 echo "$FUNCNAME:1" 139 nest-afterward-functrace/1 140 echo "$FUNCNAME:2" 141 } 142 nest-afterward-functrace 143 144 # Q source xxx の中から DEBUG trap は見えるだろうか。 145 # A 見えない。但し set -T (-o functrace) が設定されていれば見える。 146 #set -T 147 { 148 echo echo inside-source:1 149 echo builtin trap -p DEBUG 150 echo echo inside-source:2 151 } >| a.tmp 152 source ./a.tmp 153 154 exit ;; 155 156 (unset-self-func) 157 function test-unset-self-function { 158 unset -f "$FUNCNAME" 159 echo hello 160 echo world 161 } 162 test-unset-self-function 163 164 if declare -f test-unset-self-function; then 165 echo $'test-unset-self-function: \e[1;31mfound\e[m (unexpected)' 166 else 167 echo $'test-unset-self-function: \e[1;32mnot found\e[m (expected)' 168 fi 169 170 exit ;; 171 172 (check-bashbug-tmpenv) 173 set +T 174 175 function hello { 176 echo "result1:$a" 177 echo "result2:$a" 178 } 179 a=value hello 180 a=value eval hello 181 a=value builtin eval hello 182 183 function print { echo "v=${v:-(not found)}"; } 184 function trapdebug { echo "$FUNCNAME:1:v=($v)"; } 185 builtin trap 'trapdebug' DEBUG 186 v=xxxx builtin eval 'echo v=${v:-(not found)}' 187 v=xxxx eval 'echo v=${v:-(not found)}' 188 echo "[print with debugtrap]" 189 v=xxxx print 190 v=xxxx eval print 191 v=xxxx builtin eval print 192 193 exit ;; 194 195 (check-unset-trap-DEBUG) 196 # Q trace 属性のついた関数内から DEBUG trap を削除する事は可能か? 197 # A 削除できる。 198 function unset-trap { 199 builtin trap - DEBUG 200 } 201 declare -ft unset-trap 202 203 echo check-unset-trap-DEBUG:1 204 builtin trap -p DEBUG 205 echo check-unset-trap-DEBUG:2 206 unset-trap 207 echo check-unset-trap-DEBUG:3 208 builtin trap -p DEBUG 209 echo check-unset-trap-DEBUG:4 210 211 exit ;; 212 esac 213 214 if [[ $type == final ]]; then 215 source out/ble.sh --attach=none 216 elif [[ $type == final-prompt ]]; then 217 source out/ble.sh 218 fi 219 PS1='[last: '$_ps1_time'][\w]$ ' 220 221 if [[ ${BLE_VERSION-} && $type == @(final|initial) ]]; then 222 ble-attach 223 # { echo A 224 # builtin trap -p DEBUG 225 # echo B 226 # trap -p DEBUG 227 # echo C 228 # } >/dev/tty 229 fi