11

是否可以获取 Bash 代码段,但仅在某个条件成立时才从其中实际提供一个函数?

所以我要问的是,我可以无条件地从一个目录中获取所有文件,但是所获取的文件包含是否向源 shell 提供功能的逻辑。

例子:

  • .bashrc来源整个子文件夹.bashrc.d
  • .bashrc.d/xyz提供了一个可以在无法处理adduser2group的旧系统上运行的功能usermod-a -G
  • .bashrc.d/xyz如果它在这样的旧系统上运行,则应向采购外壳提供该功能。

我目前的方法是有条件地创建一个以Debian 程序alias命名的程序 ( )。所以我只实现语义,但它仍然很有帮助。adduseralias adduser=adduser2groupadduser <user> <group>

是否有不需要此解决方法的解决方案?毕竟这种方法意味着我希望避免的名称冲突的机会。

4

3 回答 3

11

您可以使用标准的 shell 逻辑来控制是否定义了函数。

lib.sh

if true; then
    foo() {
        echo foo
    }
else
    bar() {
        echo bar
    }
fi

test

#!/bin/bash

. ./lib.sh
foo
bar

运行时,仅foo定义:

$ bash test
foo
test: line 5: bar: command not found

为您的应用程序替换if true更合适的逻辑......</p>

于 2013-01-22T17:02:57.910 回答
6

您可以定义所需的功能,并且只要满足特定条件,您只需取消设置功能:

$ function alpha() { echo $1; }
$ alpha 10
10

评估您的状况 - 并认为它成立:

$ if [[ your condition ]]; then unset alpha; fi
$ alpha 10
alpha: command not found
于 2013-01-22T17:04:51.703 回答
2

作为替代方案,它似乎return也可以完成这项工作。所以可以说:

[[ condition ]] || return
于 2013-01-27T23:40:43.307 回答