如何在 bashrc 中创建本地函数?

如何在 bashrc 中创建本地函数?

我的 .bashrc 有一些重复的代码,所以我使用了一个函数来简化它

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

但是,现在当我使用 shell 时,“do_stuff”名称在范围内,因此我可以使用制表符完成并运行该函数(可能会弄乱我的环境变量)。有没有办法使“do_stuff”仅在 .bashrc 内可见?

答案1

用作unset您的最后一行.bashrc

unset -f do_stuff

将删除/取消设置该功能do_stuff

要删除/取消设置变量,请按如下方式调用它:

unset variablename

答案2

另一种选择是像其他脚本语言一样使用下划线来表明您不打算将此函数公开。您输入 _do_foo 的可能性非常小,也不太可能与其他人发生冲突。

答案3

我能想到的唯一解决方案是强调它并给它一个非常独特的名称,甚至可能像花式裤子语言一样用点命名它(但这在旧时代行不通sh)。

哎呀,这不会有任何冲突:

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

答案4

正如评论中所建议的,您可以使用子shell:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

我们在子 shell 标准输出上构建另一个脚本,以实现我们想要的唯一副作用(使用heredocument <<SIDE)。然后我们使用..

“mise en abime”的力量sh是令人恐惧的奇迹之源。

相关内容