如何在Shell中创建不替换变量的nohup执行脚本文件?
解决方案
问题出在Here Document(EOF)的变量展开机制上:默认情况下,<<EOF会将其中的变量(如$1、$@)替换为当前shell环境中的值,导致生成的脚本里变量被提前替换。
要让生成的脚本保留原始变量,只需将EOF用单引号包裹,关闭变量展开功能:
修改后的完整代码:
#!/bin/bash gen_script() { filepath=$1 if [ ! -f "$filepath" ]; then # 用单引号包裹EOF,禁止变量展开 cat >${filepath} <<'EOF' #!/bin/bash # Code generated by main.sh; DO NOT EDIT. test(){ ip=$1 port=$2 restorefile=$3 redis-cli -h $ip -p $port --pipe < $restorefile } test "$@" EOF fi } main(){ gen_script exec.sh # 传递参数时加引号,避免空格等特殊字符解析错误 nohup bash exec.sh "$1" "$2" > nohup.out 2>&1 & } main "$@"
关键修改点说明:
- 将
<<EOF改为<<'EOF':此时Here Document内的所有变量、特殊字符都会原样输出,不会被当前shell解析替换。 - 可选优化:
nohup bash exec.sh "$1" "$2"中给参数加双引号,避免当参数包含空格、特殊符号时出现解析错误。
这样生成的exec.sh内容会完全保留$1、$2等变量,执行时才会接收传入的参数进行替换。
内容的提问来源于stack exchange,提问作者moluzhui
相关产品推荐
相关产品推荐

