函数内部的评估猫

时间:2018-09-17 14:05:55

标签: bash shell eval cat

我一直在尝试在函数内评估表达式,如下所示:

eval "fn() { $(cat fn.sh); }"

fn.sh 包含以下内容:

#!/bin/sh
echo "You provided $1."

所以当我打电话时:

fn "a phrase"`

它显示“您提供了一个短语”。但是我无法使它工作。

特别令人沮丧的是:

eval "$(cat fn.sh)"

工作完美!我在这里想念什么?

我尝试过的事情:

eval "fn() { \"\$(cat fn.sh)\"; }"
fn
# bash: #!/bin/sh
# echo "You provided $1."
# return 1: No such file or directory

eval "fn() { \$(cat fn.sh); }"
fn
# bash: #!/bin/sh: No such file or directory

和其他多种组合,其中大多数是猜测。

2 个答案:

答案 0 :(得分:0)

找到答案:

eval "fn() { eval \"\$(cat "fn.sh")\"; }"

强制性reference尽最大可能解释了我理解使用eval的安全风险。

答案 1 :(得分:0)

只需在新函数内部使用source / .

fn () {
  . fn.sh "$1"
}

如果经常使用该功能,而您认为重复的磁盘I / O会成为问题,那么当您调用fn时,该文件几乎肯定会在磁盘缓存中。