执行接受参数并在后台运行的 bash shell 脚本

alb*_*789 1 linux bash shell scripting

我写了一个shell脚本run.sh来根据用户的输入触发一些任务

#!/bin/bash

echo "Please choose mode [1-3]: "
read MODE

case $MODE in

  1)
    echo -n "Enter iteration: "
    read TIME
    echo "Start Updating ..."
    task 1 && task 2 && task 3  
    ;;

  2)
    echo -n "Enter Seed Value: "
    read SEED
    echo "Start Updating ..."
    task 4
    task 5
    ;;

  3)
    echo -n "Enter regression minimum value: "
    read MIN
    echo "Start Updating ..."
    task 6
    ;;

  *)
    echo -n "Unknown option - Exit"
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

任务 1,2 ... 6 是 php 脚本,它们的运行方式类似于/usr/bin/php task1.php $TIME$TIME 作为 php 脚本等的参数...

当我打字时脚本运行良好,bash run.sh但由于任务 1-6 需要很长时间才能完成,我想要一个选项,在我与终端断开连接时在后台运行脚本。但是,如果我使用运行脚本,则会bash run.sh &遇到如下错误:

Please choose mode [1-3]: 2
-bash: 2: command not found

[5]+  Stopped                 bash run.sh
Run Code Online (Sandbox Code Playgroud)

似乎 bash 将我的输入解释2为一个不对应的参数,read MODE而不是bash run.sh 2导致错误的参数。我无法更改脚本以使任务 1-6 在后台运行task 1 & task 2 &等,因为任务 2 只能在任务 1 完成后开始运行。

我怎样才能完成我想做的事?

Len*_*nna 5

您可以在后台子shell中按顺序运行所有这些任务

( task 1; task 2; task 3 ) &
Run Code Online (Sandbox Code Playgroud)

试试这个:

( echo "One"; sleep 1; echo "Two"; sleep 2; echo "Three"; sleep 3; echo "Done" ) &
Run Code Online (Sandbox Code Playgroud)

你也可以让这个看起来更像脚本:

(
echo "One"
sleep 1
echo "Two"
sleep 2
echo "Three"
sleep 3
echo "Done"
) &
Run Code Online (Sandbox Code Playgroud)

随意使用有用的 envar $BASH_SUBSHELL

( echo $BASH_SUBSHELL; ( echo $BASH_SUBSHELL ) )
Run Code Online (Sandbox Code Playgroud)