可以在 Bash 中扩展功能吗?

MrA*_*ias 5 bash

如果我在文件中定义一个函数,请说test1.sh

#!/bin/bash

foo() {
    echo "foo"
}
Run Code Online (Sandbox Code Playgroud)

在一秒钟内,test2.sh,我尝试重新定义foo

#!/bin/bash

source /path/to/test1.sh    
...
foo() {
    ...
    echo "bar"
}
foo
Run Code Online (Sandbox Code Playgroud)

有没有办法改变test2.sh来产生:

foo
bar
Run Code Online (Sandbox Code Playgroud)

我知道可以使用 Bash 内置command函数来做,但我想知道是否可以扩展用户功能?

ric*_*ici 5

我不知道有什么好的方法(但我很乐意被证明是错误的)。

这是一个丑陋的方法:

# test2.sh
# ..
eval 'foo() {
        '"$(declare -f foo | tail -n+2)"'

        echo bar
      }'
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚编了一句众所周知的老话:“有丑陋的,也有淫秽的。丑陋可以是一门艺术,淫秽只是淫秽。Shell 脚本很丑陋,使用 eval 淫秽。” (还是喜欢聪明) (2认同)

drl*_*sta 2

我不确定是否有必要做这样的事情。您可以在函数内部使用函数,那么当您可以在新创建的函数中调用原始源函数时,为什么要重用该名称,如下所示:

AirBoxOmega:stack d$ cat source.file
#!/usr/local/bin/bash

foo() {
    echo "foo"
}
AirBoxOmega:stack d$ cat subfoo.sh
#!/usr/local/bin/bash


source /Users/d/stack/source.file
sub_foo() {
  foo
  echo "bar"
}

sub_foo
AirBoxOmega:stack d$ ./subfoo.sh
foo
bar
Run Code Online (Sandbox Code Playgroud)

当然,如果您真的想修改,您可以在新函数中获取函数,调用它,然后执行其他操作,如下所示:

AirBoxOmega:stack d$ cat source.file
#!/usr/local/bin/bash

foo() {
    echo "foo"
}
AirBoxOmega:stack d$ cat modify.sh
#!/usr/local/bin/bash


foo() {
  source /Users/d/stack/source.file
  foo
  echo "bar"
}

foo
AirBoxOmega:stack d$ ./modify.sh
foo
bar
Run Code Online (Sandbox Code Playgroud)