首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash非阻塞源(背景?)

Bash非阻塞源(背景?)
EN

Stack Overflow用户
提问于 2014-04-22 01:22:43
回答 2查看 1.3K关注 0票数 2

我试图让bash将参数传递给另一个bash,我试图通过寻找其中之一并从另一个中调用它来实现这一点,这样他们就可以在同一个外壳下做父母和孩子了。问题是子程序是一个循环,因为它在跟踪事件(可能是读取fifo(pipefile)),这阻止了bash.好的,我想让我们试着在后台运行bash,我想问题是变量不会出现,因为我想它不是在我尝试过的相同的壳下,我试着把它找回来,但是没有可能的结果。

而且在测试的某个时候,当我发送到fifo(管道文件)时,我的shell开始变得疯狂,即使没有任何东西(据我所知正在读),它的行为就好像有东西读过fifo,而我的其他bash屏幕开始做一些疯狂的事情.:O

不管怎么说,我想知道是否有人能帮我。不知道我想做什么是否可能.谢谢。

DOnt知道我在哪里读到的(至今仍能找到这一页):将脚本移动到后台使其可被父母和孩子、子进程及其爸爸妈妈访问,但到目前为止,这还不是我的经验。

bash1

代码语言:javascript
复制
   #!/bin/bash

    while true
    do

    . ./bash2.sh &

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

bash2

代码语言:javascript
复制
  #!/bin/bash

    while true
    do

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 03:18:55

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

代码语言:javascript
复制
. ./bash2.sh &

代码语言:javascript
复制
# Assuming bash2.sh is executable
./bash2.sh &

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

  1. 在前台运行. ./bash2.sh,等待它完成
  2. ./bash2.sh写入bash1.sh可以读取的东西(文件、命名管道等)。
票数 4
EN

Stack Overflow用户

发布于 2014-04-22 03:48:49

好的,您已经接近了,但是在提供的示例中有一些错误。首先,在这两个脚本中都不需要While循环,因为它在您提供的代码示例中没有用途,所以我从示例中省略了它们。

示例1

代码语言:javascript
复制
#!/bin/bash

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

示例2

代码语言:javascript
复制
#!/bin/bash

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

您要做的是使用. (source or dot operator),它将读取和执行当前shell上下文中文件名参数中的命令。

语法

代码语言:javascript
复制
  . filename [arguments]

  source filename [arguments]

当使用在现有shell中运行的源运行脚本时,脚本创建或修改的任何变量在脚本完成后仍然可用。相反,如果脚本以文件名的形式运行,那么将生成一个单独的子subshell (包含一组完全独立的变量)来运行脚本。

这意味着您要执行,而不是,希望使用&将第二个脚本发送到一个新进程,因为它将永远不会返回到主脚本。

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

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

代码语言:javascript
复制
[ -e / ] && return $TRUE || return $FALSE

-e是一个bash 文件测试操作符,用于检查FILE的存在。

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

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

再读

我将这个参考文献用于bash,我认为值得一提的是

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23208775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档