sh shell将子shell重定向到文件,无法找到正确的语法

时间:2018-05-17 10:43:18

标签: linux bash shell sed subshell

我想以编程方式运行sed命令并更改参数。 问题是我无法找到正确的语法。 我想用这个和配置一个conf文件 将dir路径更改为另一个。

我目前正在使用:

RESULT=$("sed 's/--ROOT_DIR--/${root_inst_dir}/g' ${root_inst_dir}/${tool_name}/etc/${tool_name}.conf > ${SOURCE_DIR}/${tool_name}.conf")

我收到错误消息:

./change_tst.sh: line 7: sed 's/--ROOT_DIR--//home/test_dir/g' /home/tst/conf.conf > /home/script_tst/conf.conf: No such file or directory

">"由于某种原因不起作用。

我在做错了什么?或者最好的方法是什么?

更新

我下垂了结果变量,然后运行它:

(sed 's/--ROOT_DIR--/$root_inst_dir/g' ${root_inst_dir}/${tool_name}/etc/${tool_name}.conf) > ${SOURCE_DIR}/${tool_name}.conf

正在>中创建新文件$ {SOURCE_DIR} / $ {} tool_name的.conf, 但搜索/替换是字面上发生的而不是变量...

感谢。

1 个答案:

答案 0 :(得分:3)

在括号内放置"将导致bash想要执行一个名为的命令:

sed 's/--ROOT_DIR--/${root_inst_dir}/g' ${root_inst_dir}/${tool_name}/etc/${tool_name}.conf > ${SOURCE_DIR}/${tool_name}.conf"

您的系统上不存在此类命令。 您可能打算将"放在$(...)之外:

RESULT="$(sed 's/--ROOT_DIR--/${root_inst_dir}/g' ${root_inst_dir}/${tool_name}/etc/${tool_name}.conf > ${SOURCE_DIR}/${tool_name}.conf)"

更好的方法,如果你不需要RESULT变量,并且你想要正确地转义root_inst_dir变量:

sed 's#--ROOT_DIR--#'"${root_inst_dir}"'#g' "${root_inst_dir}/${tool_name}/etc/${tool_name}.conf" > "${SOURCE_DIR}/${tool_name}.conf"

或者如果你需要RESULT变量:

sed 's#--ROOT_DIR--#'"${root_inst_dir}"'#g' "${root_inst_dir}/${tool_name}/etc/${tool_name}.conf" > "${SOURCE_DIR}/${tool_name}.conf"
RESULT=$(cat ${SOURCE_DIR}/${tool_name}.conf)