nohup调用带参Shell脚本方法参数未生效的正确传参方式
问题根因
参数无法被start方法获取和nohup语法无关,核心问题是/bin/scripts/first.ksh仅定义了start()函数,脚本主体没有任何调用该函数的逻辑。执行脚本时传入的start、arg1是脚本级别的位置参数,不会自动传入内部定义的函数,因此函数拿不到传入的值。
修正方案
按需选下面两种方案就行:
方案1:修改first.ksh增加函数调度逻辑(推荐)
在first.ksh末尾加参数调度语句,把脚本接收到的位置参数透传给对应函数,修正后的/bin/scripts/first.ksh内容如下:
#!/bin/bash start(){ first="$1"; echo "arg is $first" } # 取第一个参数作为要执行的函数名,剩余参数透传给目标函数 "$@"
这时候second.sh里的nohup调用语句不用改,原来的写法就能正常传参:
#!/bin/bash nohup sh /bin/scripts/first.ksh start arg1 > nohup_log 2>&1 &
执行后nohup_log文件里会正常输出arg is arg1。
方案2:不修改first.ksh,调整nohup调用逻辑
如果不能改first.ksh的原有内容,就在nohup调用时先加载first.ksh的函数定义,再主动调用start函数传参,修正后的/bin/scripts/second.sh内容如下:
#!/bin/bash nohup sh -c '. /bin/scripts/first.ksh; start arg1' > nohup_log 2>&1 &
这种写法会在nohup启动的子shell里先加载first.ksh的所有函数定义,再直接执行start函数并传入arg1参数,不用改原first.ksh代码就能正常传参。
内容的提问来源于stack exchange,提问作者nongjai
相关产品推荐
相关产品推荐

