Linux sh shell将子shell重定向到文件,can';找不到正确的语法

Linux sh shell将子shell重定向到文件,can';找不到正确的语法,linux,bash,shell,sed,subshell,Linux,Bash,Shell,Sed,Subshell,我想运行一个sed命令,以编程方式更改参数。 问题是我找不到这样做的正确语法。 我想用这个和配置一个conf文件 将一个dir路径更改为另一个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

我想运行一个sed命令,以编程方式更改参数。 问题是我找不到这样做的正确语法。 我想用这个和配置一个conf文件 将一个dir路径更改为另一个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\u DIR}/${tool\u name}.conf中创建新文件, 但是搜索/替换是按字面意思进行的,而不是作为一个变量

谢谢。

放在括号内会导致bash想要执行一个名为:

sed 's/--ROOT_DIR--/${root_inst_dir}/g' ${root_inst_dir}/${tool_name}/etc/${tool_name}.conf > ${SOURCE_DIR}/${tool_name}.conf"
您的系统上不存在此命令。 可能您打算将
置于
$(…)
之外:

更好的方法是,如果不需要结果变量,并且希望正确转义
root\u inst\u dir
变量:

sed 's#--ROOT_DIR--#'"${root_inst_dir}"'#g' "${root_inst_dir}/${tool_name}/etc/${tool_name}.conf" > "${SOURCE_DIR}/${tool_name}.conf"
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)
或者,如果需要结果变量:

sed 's#--ROOT_DIR--#'"${root_inst_dir}"'#g' "${root_inst_dir}/${tool_name}/etc/${tool_name}.conf" > "${SOURCE_DIR}/${tool_name}.conf"
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)
放在括号内将导致bash希望执行一个名为:

sed 's/--ROOT_DIR--/${root_inst_dir}/g' ${root_inst_dir}/${tool_name}/etc/${tool_name}.conf > ${SOURCE_DIR}/${tool_name}.conf"
您的系统上不存在此命令。 可能您打算将
置于
$(…)
之外:

更好的方法是,如果不需要结果变量,并且希望正确转义
root\u inst\u dir
变量:

sed 's#--ROOT_DIR--#'"${root_inst_dir}"'#g' "${root_inst_dir}/${tool_name}/etc/${tool_name}.conf" > "${SOURCE_DIR}/${tool_name}.conf"
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)
或者,如果需要结果变量:

sed 's#--ROOT_DIR--#'"${root_inst_dir}"'#g' "${root_inst_dir}/${tool_name}/etc/${tool_name}.conf" > "${SOURCE_DIR}/${tool_name}.conf"
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)

在那里:)仔细检查。即使不存在,它也应该创建它,但它确实存在。我认为目录脚本不存在。您希望在
结果中存储什么?sed命令的输出或其退出状态或其他信息?您的问题需要包括简明的、可测试的示例输入和预期的输出,以便我们能够帮助您。sed命令的输出应该通过“>”重定向到文件,结果我希望得到退出状态it's here:)仔细检查。即使不存在,它也应该创建它,但它确实存在。我认为目录脚本不存在。您希望在
结果中存储什么?sed命令的输出或其退出状态或其他信息?您的问题包括简明、可测试的示例输入和预期输出,以便我们可以帮助您。sed命令的输出应通过“>”重定向到文件,结果我希望得到退出状态注意,绝对没有理由写入
result=“$(cmd>redirected)”
,因为它保证将空字符串分配给结果。您不妨编写
RESULT=“”;cmd>重定向!你可以做
RESULT=$(cmd | tee redirected)
-虽然我不认为这比这个答案中的建议更好,但是没有结果我可以活下去,但是你的例子不起作用,我试过:(sed's/--ROOT\u DIR--/$ROOT\u inst\u DIR/g'${ROOT\u inst\u DIR}/${tool\u name}.conf,这是可行的,但“”中的/search/replace值是按字面意思而不是作为变量。。。如何转义“”中的变量?如果变量
root\u inst\u dir
包含
/
字符,则sed实用程序将其解析为命令分隔符。尝试使用
作为分隔符,如
sed的#--ROOT#u DIR--“$ROOT#u inst#u DIR”'#g'
(并确保变量ROOT#u inst#u DIR不包含任何
字符。如果包含,它们不需要进行转义以使sed实用程序工作)@KamilCuk,你是我的英雄:)非常感谢你。。。在你的答案上更新此评论,我会将其标记为“一”。再次感谢!请注意,绝对没有理由写入
RESULT=“$(cmd>redirected)”
,因为它保证将空字符串分配给RESULT。您不妨编写
RESULT=“”;cmd>重定向!你可以做
RESULT=$(cmd | tee redirected)
-虽然我不认为这比这个答案中的建议更好,但是没有结果我可以活下去,但是你的例子不起作用,我试过:(sed's/--ROOT\u DIR--/$ROOT\u inst\u DIR/g'${ROOT\u inst\u DIR}/${tool\u name}.conf,这是可行的,但“”中的/search/replace值是按字面意思而不是作为变量。。。如何转义“”中的变量?如果变量
root\u inst\u dir
包含
/
字符,则sed实用程序将其解析为命令分隔符。尝试使用
作为分隔符,如
sed的#--ROOT#u DIR--“$ROOT#u inst#u DIR”'#g'
(并确保变量ROOT#u inst#u DIR不包含任何
字符。如果包含,它们不需要进行转义以使sed实用程序工作)@KamilCuk,你是我的英雄:)非常感谢你。。。在你的答案上更新此评论,我会将其标记为“一”。再次感谢!