Bash shell脚本,只运行脚本的某个部分&

时间:2017-04-11 19:23:58

标签: linux bash shell

我想创建一个在后台运行的脚本(带&),并检查某个文件,其名称是从键盘读取的,存在于多个目录中,作为参数给出。

因此脚本将在while true循环中运行,直到创建具有给定名称的文件。

问题是,当我运行脚本时,我从读取的内容被视为普通的终端cmd。

这是脚本:

#!/bin/bash

echo Type the file name
read fileName


while true
do
    for file in $@
    do
        if find $file -name $fileName | grep -q "$fileName"
        then
            echo The file with name $fileName has been created!!!
            break
        fi
    done
done

如果我没有使用&运行脚本,它可以正常工作。

3 个答案:

答案 0 :(得分:3)

我认为你想要做的只是将没有用户输入的脚本部分发送到后台。如果在脚本中而不是在命令行中使用&,则可以这样做。

#!/bin/bash

echo Type the file name
read fileName

while true
do
    for file in "$@"
    do
        if find "$file" -name "$fileName" | grep -q "$fileName"
        then
            echo "The file with name $fileName has been created!!!"
            break
        fi
    done
done &

请注意我添加了额外的引用,以防止名称包含特殊字符的文件出现问题。

如果需要,您也可以将while循环选项设置为背景,以便您可以在调用脚本时选择您喜欢的行为。

答案 1 :(得分:0)

我将使用以下命令替换您的脚本:

  sleep 2; read -p "x=" x; echo "x=$x"

您可以在不更改"脚本的情况下获得输入"与

  echo Hello | sleep 2; read -p "x=" x; echo "x=$x"

如果您希望将脚本放在一起,请使用

  echo Hello | (sleep 2; read -p "x=" x; echo "x=$x")

将命令放在ackground中似乎很好用:

  echo Hello | (sleep 2; read -p "x=" x; echo "x=$x")&

如果您想在后台使用echo Hello,请使用

  (echo Hello | (sleep 2; read -p "x=" x; echo "x=$x"))&

答案 2 :(得分:0)

您可以通过在命令行中提供文件名来简化此操作,如果可以接受,请参阅以下内容:

#!/bin/bash

fileName="$1"
shift

while true
do
    for file in "$@"
    do
        if find "${file}" -name "${fileName}" | grep -q "${fileName}"
        then
            echo The file with name ${fileName} has been created!!!
            break
        fi
    done
done

您可以通过以下方式启动:

$ ./script.sh FILE DIR1 DIR2 &