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


40

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

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

do_stuff '5.1'
do_stuff '5.2'

但是,现在使用外壳程序时,“ do_stuff”名称已在范围内,因此我可以使用Tab键完成并运行该功能(可能会弄乱我的环境变量)。有没有一种方法可以使“ do_stuff”仅在.bashrc内部可见?


2
如果您不希望导出,还可以使用它()来创建子外壳。对于简单情况,另一种可能性是使用for version in 5.1 5.2循环,尽管这可以让它version逃脱。
Ciro Santilli新疆改造中心法轮功六四事件

Answers:


40

使用unset在你的最后一行.bashrc

unset -f do_stuff

将删除/取消设置功能do_stuff

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

unset variablename

这真的是唯一的方法吗?好吧,我想如果我对函数使用一个非常长且丑陋的名称,它与其他内容发生冲突的机会就不会那么大了……
hugomg 2013年

如果那是问题,请首先检查该函数是否存在:if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi
2013年

8
如果do_stuff在另一个函数中使用,则无法使用。调用该函数时,您将得到bash: do_stuff: command not found。我知道这不是操作人员正在谈论的确切情况,但值得指出。
Burhan Ali 2014年


15

另一个选择是像其他脚本语言一样使用下划线表示您不打算将此功能公开。您输入_do_foo的可能性很小,并且也不太可能与其他任何人发生冲突。


1
是的,请使用“ _”表示意图具有私有功能,但这与冲突无关。任何人都可以使用“ _debug()”或“ _safe_copy()”。如果存在有助于避免冲突的内容,则与下划线无关
Alois Mahdal 2014年

3

我能想到的唯一解决方案是在其下划线,并为其赋予一个非常独特的名称,甚至可能使用像fantpant语言之类的点来命名它(但这在您sh过去不起作用)。

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

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

0

如注释中所建议,您可以使用子外壳:

#!/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,'

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

“ mise en abime”的力量sh令人惊讶。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.