我试图让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
由于
答案 0 :(得分:2)
因为&
总是启动一个新进程,所以
. ./bash2.sh &
和
# Assuming bash2.sh is executable
./bash2.sh &
bash2.sh
定义的任何变量都局限于执行它的进程;它们不适用于bash1.sh
。你的选择是
. ./bash2.sh
,等待其完成./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很多,我认为值得一提