You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:41:44