我是 Linux shell 脚本编程的新手,编写了如下脚本。
脚本运行良好,但是在程序完成并回显程序已完成后,我必须手动按键盘上的 [ENTER] 才能获取命令行提示符。为什么我的脚本会这样?
我应该怎么做,以便当子进程完成并且脚本回显程序已完成时,控制权返回到命令行,并且我无需执行任何操作即可获得命令行提示符?
#!/bin/ksh
echo "program running..."
funcall(){
nohup <<command_name>> $program >/dev/null 2>&1
pid = $!
wait pid
echo "program completed..."
exit
}
fork(){
funcall &
}
fork
答案1
分叉进程等待自身的情况是非常不寻常的。
控制流程应该是
- 分叉进程
- 子进程做它的事情
- 父母做它的事情并等待
这会转化为类似的东西
#!/bin/ksh
echo "program running..."
funcall () {
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."
}
fork () {
funcall &
}
fork
child_pid="$!"
wait "$child_pid"
请注意,在这种情况下,完全不需要调用的后台funcall
以及等待函数调用返回,因为函数在运行fork
时不执行任何操作。funcall
您的代码所做的就是在后台启动子 shell,并立即将控制权返回给父 shell。脚本的输出可能会导致提示有点混乱。
请注意,您的脚本中还有一些错误:
pid
被用作变量,但应该是$pid
.- 分配给 的
pid
周围不应有空格=
。
另外,exit
也不需要。
满足您需要的精简脚本是
#!/bin/ksh
echo "program running..."
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."
答案2
进程完成后,您已经处于命令提示符处,但提示符本身被脚本后台部分的输出所掩盖。
按 Enter 键将运行您在命令行上输入的任何命令(可能什么也没有),然后再次打印提示符,看似“恢复提示符”。
要在出现杂散输出后清理屏幕,请按 Ctrl-L。
答案3
更改代码从 funcall&
到funcall
。由于是funcall
在后台运行,父进程IE。你的脚本正在等待完成子进程。
如果您在前台运行 funcall,您的程序会正常退出。