在函数内评估猫

eval cat inside a function

我一直在尝试对函数内部的表达式求值,如下所示:

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

其中 fn.sh 包含以下内容:

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

所以当我打电话时:

fn "a phrase"`

它打印 "You provided a phrase."。但是我无法让它工作。

特别令人沮丧的是:

eval "$(cat fn.sh)"

完美运行!我在这里错过了什么?

我试过的:

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

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

以及无数其他组合,此时大部分都是猜测。

找到答案:

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

强制性 reference 最好地解释了我理解使用 eval 的安全风险。

只需在新函数中使用 source/.

fn () {
  . fn.sh ""
}

如果在您认为重复磁盘 I/O 会成为问题的地方经常使用该函数,则当您调用 fn.[=14= 时,文件几乎肯定会在磁盘缓存中]