Bash非阻塞源(后台???)

时间:2014-04-22 01:22:44

标签: linux bash shell named-pipes

我试图让bash将参数传递给另一个bash,我通过获取其中一个并从另一个中调用它来做到这一点,所以他们将在同一个shell下成为父和子。问题是,孩子是一个循环,因为我正在捕捉事件(它可能正在读取一个fifo(管道文件))并且这阻止了bash ...对,所以我想要嗯让我们尝试运行bash on后面的地面和问题我到这里我猜是变量不会来int intcuase我想它不是在同一个shell我尝试采购和背景但没有可能的结果......

在某些时候测试我的shell开始变得疯狂当我发送到fifo(管道文件)即使没有(我知道正在阅读)它就好像有什么东西读了那个fifo,以及我的其他一些bash屏幕开始做疯狂的事情......:O

无论如何想知道是否有人可以帮助我。不知道我试图做什么甚至是可能的......谢谢。

不知道我在哪里阅读(还能再次找到该页面),将脚本移动到后台使其可以访问父母和子女,子流程及其爸爸妈妈,但这不是我的经验到目前为止。

bash1

   #!/bin/bash

    while true
    do

    . ./bash2.sh &

    if [[ $VARIABLE = 1 ]]; then
    echo "message recevied"
    fi

bash2

  #!/bin/bash

    while true
    do

    if [[ $(cat ./fifo1) = 0 ]]; then
    VARIABLE=1
    fi
    done

由于

2 个答案:

答案 0 :(得分:2)

因为&总是启动一个新进程,所以

之间几乎没有区别
. ./bash2.sh &

# Assuming bash2.sh is executable
./bash2.sh &

bash2.sh定义的任何变量都局限于执行它的进程;它们不适用于bash1.sh。你的选择是

  1. 在前台运行. ./bash2.sh,等待其完成
  2. ./bash2.sh写入bash1.sh的某些内容(文件,命名管道等)    可以阅读。

答案 1 :(得分:1)

你很亲密,但你提供的例子中有一些错误。首先,您不需要在任何一个脚本中使用While循环,因为它在您提供的代码示例中没有用处,所以我在示例中省略了它们。

示例1

#!/bin/bash

external_function(){
   echo "This is printed from the sourced script"; 
   [ -e ./fifo1 ] && return $TRUE || return $FALSE
}

示例2

#!/bin/bash

source ./test.sh
external_function && echo "the file exists" || echo "The file doesn't exist" 
exit

你正在做的是使用. (source or dot operator),它将从当前shell上下文中的filename参数读取和执行命令。

语法

  . filename [arguments]

  source filename [arguments]

当使用源运行脚本时,它在现有shell中运行,脚本完成后,脚本创建或修改的任何变量都将保持可用。相反,如果脚本只是作为文件名运行,那么将生成一个单独的子shell(带有一组完全独立的变量)来运行脚本。

这意味着您 NOT 希望使用&将第二个脚本分叉到新进程,因为它永远不会返回到主脚本。

此外,我通常会将我希望在第二个(源)脚本中运行的代码放在函数中。我认为这样可以更容易阅读,您可以使用它来检查函数的返回代码,使调试更容易。

最后if [[ $(cat ./fifo1) = 0 ]]只是检查存在,因为您正在检查cat命令的退出状态。你可以通过下面这一行简单地说明这一点:

[ -e / ] && return $TRUE || return $FALSE

-e是一个bash File Test Operator,用于检查FILE的存在。

&&是bash Operator,如果最后一个命令返回成功退出代码(非零),它将运行以下命令

||是一个bash Operator,如果最后一个命令返回失败的退出代码(零),它将运行以下命令

进一步阅读

我将这个reference用于bash很多,我认为值得一提