当前位置:   article > 正文

linux下如何取消只读变量,在bash中取消设置readonly变量

bash: prompt_command: readonly variable

F. Hauri..

5

但是使用更简单的语法:

gdb -ex 'call unbind_variable("PI")' --pid=$$ --batch

经过改进的功能:

我的destroy功能:

或如何使用可变的元数据。注意罕见bashisms的用法:local -n VARIABLE=$1和${VARIABLE@a}...

destroy () {

local -n variable=$1

declare -p $1 &>/dev/null || return -1 # Return if variable not exist

local reslne result flags=${variable@a}

[ -z "$flags" ] || [ "${flags//*r*}" ] && {

unset $1 # Don't run gdb if variable is not readonly.

return $?

}

while read resline; do

[ "$resline" ] && [ -z "${resline%\$1 = *}" ] &&

result=${resline##*1 = }

done <

gdb 2>&1 -ex 'call unbind_variable("'$1'")' --pid=$$ --batch

)

return $result

}

您可以将其复制到名为的bash源文件中destroy.bash,作为示例...

说明:

1 destroy () {

2 local -n variable=$1

3 declare -p $1 &>/dev/null || return -1 # Return if variable not exist

4 local reslne result flags=${variable@a}

5 [ -z "$flags" ] || [ "${flags//*r*}" ] && {

6 unset $1 # Don't run gdb if variable is not readonly.

7 return $?

8 }

9 while read resline; do

10 [ "$resline" ] && [ -z "${resline%\$1 = *}" ] &&

11 result=${resline##*1 = }

12 done <

13 gdb 2>&1 -ex 'call unbind_variable("'$1'")' --pid=$$ --batch

14 )

15 return $result

16 }

第2行创建对提交变量的本地引用。

第3行防止在不存在的变量上运行

第4行将参数的属性(meta)存储到中$flags。

第5至8行将运行,unset而不是gdb如果不存在readonly标志

线9至12 while read ... result= ... done的获取返回代码call unbind的gdb输出

第13行gdb使用--pid和的语法--ex(请参阅参考资料gdb --help)。

第15行返回$result的call unbind命令。

正在使用:

source destroy.bash

# 1st with any regular (read-write) variable:

declare PI=$(bc -l <<

echo $PI

3.14159265358979323844

echo ${PI@a} # flags

declare -p PI

declare -- PI="3.14159265358979323844"

destroy PI

echo $?

0

declare -p PI

bash: declare: PI: not found

# now with read only variable:

declare -r PI=$(bc -l <<

declare -p PI

declare -r PI="3.14159265358979323844"

echo ${PI@a} # flags

r

unset PI

bash: unset: PI: cannot unset: readonly variable

destroy PI

echo $?

0

declare -p PI

bash: declare: PI: not found

# and with non existant variable

destroy PI

echo $?

255

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号