在 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

这样本地就被声明替换了,然后我可以用包装器修改。