当前位置:  开发笔记 > 编程语言 > 正文

在后台shell中分配变量

如何解决《在后台shell中分配变量》经验,为你挑选了1个好方法。

我想在后台分配一个变量,而我正在显示这样的进度指示器

sleep_echo(){
  sleep $1
  echo $2
}
show_ellapsed_time () {
  #...
}

(mivar=$(sleep_echo 3 hello)) &
show_ellapsed_time $!
echo $mivar
echo "after asignment"

当我在终端中运行它时,它输出进度指示器,然后回声myvar

processing 00:00:03 [\]
hello
after asignment

但是,当我在脚本中运行它时,分配不会发生

processing 00:00:03 [\]

after asignment

为什么这会失败?是不是调用了te函数?



1> Fred..:

子进程无法通过变量赋值与其父进程通信.

在Bash中,可以通过多种方式创建子进程:

启动外部命令

通过用语句封闭语句来启动子shell ()

使用重定向(例如管道)时启动子shell

在后台启动任何内容 &

外部命令接收标记为导出的所有shell变量的副本(例如export VAR,local -x VAR)

子壳接收所有变量的副本.这很有用,但很容易意识到你处于一个新的环境中.父进程永远不会看到在子进程中进行的任何赋值.

你可以做什么:

使用进程间通信来捕获输出

将所需信息放在文件中,因为所有进程都可以访问文件(假设有足够的权限)

使用命名FIFO,这是一种特殊类型的文件,允许单独的进程进行通信(请参阅参考资料mkfifo).

以一种方式构造脚本,通过使用正确的构造来构建管道,在主上下文中保留最需要它的代码块.

对于最后一个,使用类似的进程替换<(COMMAND)并且>(COMMAND)通常比使用的典型管道好得多|,例如允许while循环体(或者,实际上,任何其他语句,替换被馈送到/来自)保留在上下文中的脚本.这允许循环内的变量赋值具有预期的效果.

在你的情况下,你有这些线:

(mivar=$(sleep_echo 3 hello)) &
show_ellapsed_time $!

也许你可以用以下内容替换它们:

show_ellapsed_time &
BG_PID=$!
mivar=$(sleep_echo 3 hello)
kill $BG_PID

我不知道你show_ellapsed_time知道如果没有你传递给该函数的参数,它是否可以工作,但是赋值可以工作.您还可以将主shell的PID传递给函数,如下所示:

show_ellapsed_time $$ &

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有