执行嵌入脚本中的shell函数,用cat读取

时间:2016-09-02 14:45:21

标签: bash function shell call cat

#!/usr/bin/env bash

function foo(){
    param=$1
    echo "$param"
}


content="calling this one with param: $(foo 'this is test param1')"

echo "$content"

结果:用param调用这个:这是test param1

请注意,foo被称为

但是,当内容移动到test.txt文件时,以下内容不起作用,即test.txt有 - 用param调用此文件:$(foo 'this is test param1')

fileName="test.txt"

content=$(cat "$fileName")



echo "$content"

结果:使用param调用:$(foo'这是测试参数1')

请注意,foo未被调用

问题:如何为第二种情况调用foo

4 个答案:

答案 0 :(得分:2)

示例实施

## Setting up the input file
fileName=foo.txt
cat >"$fileName" <<'EOF'
foo 'this is test param1'
EOF

## Running the test
foo() {
  param=$1
  echo "$param"
}

content=$(source "$fileName")
echo "$content"

...发出输出:

this is test param1

注释

  • 此处的输入文件包含foo 'this is test param1',而不是$(foo 'this is test param1')。否则,你有两个$()嵌套,这意味着外部的一个将作为命令执行内部的输出(在parsing it in a way very unlikely to be useful之后)。
  • 读取文件必然与执行文件不同。 foo=$(cat bar)cat bar的确切输出分配给foo;它实际上并没有运行bar的内容,就像它们是一个脚本一样。
  • 要在给定的shell中使用某个函数,它需要由父进程(使用export -f)导出,或者在同一个shell中定义,或者执行shell为的shell。 subshel​​l(a&#34; subshel​​l&#34;是由fork()创建的shell实例,后面没有exec()。)
  • 使用source关键字在现有shell中运行文件的内容。
  • 使用$(),如( ),隐式创建子shell。除非明确地运行独立的shell实例(通过调用bashsh或类似的实例),否则父上下文中的函数即使未导出也可在此上下文中使用。
  • 如果您真的想要使用cat,则可以运行content=$(eval "$(cat "$fileName")") - 尽管从source几乎所有方面都会更糟。

答案 1 :(得分:1)

您的代码:

content=$(cat "$fileName")

只运行cat命令并将文件内容存储在$content中。它不执行脚本。如果要执行脚本:

content=$(bash "./$fileName")

答案 2 :(得分:1)

有点黑客但做的工作是:

fileName="test.txt"

function foo(){
    param=$1
    echo "$param"
}
# export the function
export -f foo
# pipe result to bash with a temp variable (bash $fileName won't consider foo for some reason)
echo "z=$(cat $fileName); echo \"\$z\"" | bash

答案 3 :(得分:1)

将参数传递给foo函数。

function foo(){
    param=$1
    echo "$param"
}

fileName="test.txt"

content=$(foo "$(cat "$fileName")")

echo "$content"