在 Bash 别名中有条件地中止
Conditionally aborting in a Bash alias
我有一个别名:
alias local='if [ -z "${FUNCNAME[0]}" ]; then builtin local; fi; declare'
我想用它来将本地命令重定向到我修改过的声明函数中,然后它可以声明变量,并且如果在函数外部则只使用 builtin local
来获取错误消息。
别名的输出为(使用 set -x):
+ '[' -z '' ']'
+ builtin local
-bash: local: can only be used in a function
+ declare
现在它无论如何都会执行 declare
,如果检查失败我希望它退出。我不能为此使用函数。
到目前为止,我已经尝试 return,中断并退出(出于显而易见的原因不在此处退出):
alias 'local=if [ -z "${FUNCNAME[0]}" ]; then builtin local; return 1; break; fi; declare'
+ '[' -z '' ']'
+ builtin local
-bash: local: can only be used in a function
+ return 1
-bash: return: can only `return' from a function or sourced script
+ break
-bash: break: only meaningful in a `for', `while', or `until' loop
+ declare
示例:
# When outside an function
local some_var=val
+ '[' -z '' ']'
+ builtin local
-bash: local: can only be used in a function
# That's it
# When inside an function func
local some_var=val
+ '[' -z func ']'
+ declare some_var=val
# Uses my modified declare function
不确定为什么需要这样的别名。无论如何,不要为此使用别名。改为使用函数:
local() {
if [ -z "${FUNCNAME[0]}" ]; then
builtin local "$@"
else
declare -g "$@" # -g (for global) is necessary - otherwise variable set by declare would be local to the function
fi
}
由于 builtin local
仅用于获取错误消息,这将起作用:
alias local='builtin local 2>&1 >/dev/null; [ -n "${FUNCNAME[0]}" ] && declare'
如果不在函数内部,它将始终只打印错误,但如果在函数内部,则不会打印出所有局部变量:
$> func () { local var2=foo; local var=bar; echo $var; }
$> func
+ func
+ builtin local
+ '[' -n func ']'
+ declare var2=foo
+ builtin local
+ '[' -n func ']'
+ declare var=bar
+ echo bar
bar
这样本地就被声明替换了,然后我可以用包装器修改。
我有一个别名:
alias local='if [ -z "${FUNCNAME[0]}" ]; then builtin local; fi; declare'
我想用它来将本地命令重定向到我修改过的声明函数中,然后它可以声明变量,并且如果在函数外部则只使用 builtin local
来获取错误消息。
别名的输出为(使用 set -x):
+ '[' -z '' ']'
+ builtin local
-bash: local: can only be used in a function
+ declare
现在它无论如何都会执行 declare
,如果检查失败我希望它退出。我不能为此使用函数。
到目前为止,我已经尝试 return,中断并退出(出于显而易见的原因不在此处退出):
alias 'local=if [ -z "${FUNCNAME[0]}" ]; then builtin local; return 1; break; fi; declare'
+ '[' -z '' ']'
+ builtin local
-bash: local: can only be used in a function
+ return 1
-bash: return: can only `return' from a function or sourced script
+ break
-bash: break: only meaningful in a `for', `while', or `until' loop
+ declare
示例:
# When outside an function
local some_var=val
+ '[' -z '' ']'
+ builtin local
-bash: local: can only be used in a function
# That's it
# When inside an function func
local some_var=val
+ '[' -z func ']'
+ declare some_var=val
# Uses my modified declare function
不确定为什么需要这样的别名。无论如何,不要为此使用别名。改为使用函数:
local() {
if [ -z "${FUNCNAME[0]}" ]; then
builtin local "$@"
else
declare -g "$@" # -g (for global) is necessary - otherwise variable set by declare would be local to the function
fi
}
由于 builtin local
仅用于获取错误消息,这将起作用:
alias local='builtin local 2>&1 >/dev/null; [ -n "${FUNCNAME[0]}" ] && declare'
如果不在函数内部,它将始终只打印错误,但如果在函数内部,则不会打印出所有局部变量:
$> func () { local var2=foo; local var=bar; echo $var; }
$> func
+ func
+ builtin local
+ '[' -n func ']'
+ declare var2=foo
+ builtin local
+ '[' -n func ']'
+ declare var=bar
+ echo bar
bar
这样本地就被声明替换了,然后我可以用包装器修改。