自动将脚本移到后台

Mar*_*usP 1 bash shell-script

正在运行的脚本是否有可能将自身移动到后台?

我有一个目标:我运行脚本:./script.sh. 该脚本要求我输入密码:

echo -n PASSWORD:
read -s pass
if [ "${scriptPassword}" == "$pass" ] && [[ ${pass_counter} = 0 ]]; then
pass_counter = $ ((pass_counter + 1))
echo "PASSWORD OK"
Run Code Online (Sandbox Code Playgroud)

然后我想达到与按Ctrl+Z 然后运行命令时相同的效果bg。我可以在脚本中运行这样的命令吗?

我希望脚本开始工作,就像它以 开头一样 nohup ./script.sh &,但前提是用户输入了正确的密码。

G-M*_*ca' 6

1. 直接方法

这有点类似于Hauke Laging 的答案,但更简单。?在您的脚本完成其交互业务后,请执行

(kill -STOP $$; kill -CONT $$) &
sleep 1
Run Code Online (Sandbox Code Playgroud)

在这里,脚本产生一个非常小的(异步)子shell来阻止它(脚本程序),大同小异*Ctrl+Z做,然后用重新启动它intue信号,大同小异的bg一样。你甚至可能不需要sleep; 我只是认为如果在信号进入时脚本没有做任何重要的事情可能会更安全。

我已经测试过这个,但只是表面的,所以如果你在真实的应用程序上下文中使用它可能会有惊喜。
____________
*不同之处在于Ctrl+Z发送 SIGTSTP。您可能可以在脚本中使用 SIGTSTP 而不是 SIGSTOP。我用 SIGSTOP 对其进行了测试,如果有效,我看不出有任何更改它的理由。

2. 可以说更简单(也许更便携?)

让脚本异步调用自身。

if [ "$exported_pa​​ss" != "$scriptPassword" ]
然后
    [在此处插入适当的代码以读取通行证从用户并循环]
    [ 直到正确(或者尝试次数过多,所以我们退出)。]
    # 所以此时,"$scriptPassword" == "$pass"
    出口通行证=“$通行证”
    出口exported_pa​​ss
    nohup "$0" "$@" &
    出口
菲

脚本第一次运行时,$exported_pass不会被设置,所以它进入if-then并要求输入密码。然后将其放入exported_pass环境变量并异步调用自身——然后主(父)进程退出。在后台运行的脚本的第二次调用会看到环境中的密码,然后继续执行它的工作。