#!/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
答案 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
的内容,就像它们是一个脚本一样。export -f
)导出,或者在同一个shell中定义,或者执行shell为的shell。 subshell(a&#34; subshell&#34;是由fork()
创建的shell实例,后面没有exec()
。)source
关键字在现有shell中运行文件的内容。$()
,如( )
,隐式创建子shell。除非明确地运行独立的shell实例(通过调用bash
,sh
或类似的实例),否则父上下文中的函数即使未导出也可在此上下文中使用。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"