Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从bash中的循环开始的后台进程能否从以后的迭代中获取值?_Linux_Bash_Shell_Loops_While Loop - Fatal编程技术网

Linux 从bash中的循环开始的后台进程能否从以后的迭代中获取值?

Linux 从bash中的循环开始的后台进程能否从以后的迭代中获取值?,linux,bash,shell,loops,while-loop,Linux,Bash,Shell,Loops,While Loop,在Bash中,如果我有一个while true循环,在循环的顶部,我设置了一个等于当前日期的变量,并且在随后的后台命令中我使用这个变量(例如,命名输出文件),如果第三次执行日期=$(日期),会发生什么情况在第二次执行另一个命令之前出现 即:给定以下循环: while:;做 日期=$(日期) backgroundcommand-o$date& 背景命令2-o$日期& 完成 如果命令按以下顺序执行: date=$(date)#第一次执行 backgroundcommand-o$date&#首次执行

在Bash中,如果我有一个
while true
循环,在循环的顶部,我设置了一个等于当前
日期的变量,并且在随后的后台命令中我使用这个变量(例如,命名输出文件),如果第三次执行
日期=$(日期),会发生什么情况
在第二次执行另一个命令之前出现

即:给定以下循环:

while:;做
日期=$(日期)
backgroundcommand-o$date&
背景命令2-o$日期&
完成
如果命令按以下顺序执行:

date=$(date)#第一次执行
backgroundcommand-o$date&#首次执行
backgroundcommand2-o$日期和首次执行
日期=$(日期)#第二次执行
backgroundcommand-o$date和#第二次执行
日期=$(日期)#第三次执行
backgroundcommand2-o$日期和第二次执行
backgroundcommand-o$date和#第三次执行
背景命令2-o$日期和第三次执行

Bash是否跟踪变量状态?例如:经过3次循环后,我会有3对日期相同的文件,还是会有两个文件,一个文件和三个文件分别同名?

子shell中的任何内容或任何后台命令都是一个完全独立的过程;与线程(共享内存)不同,这样一个独立的进程完全独立于它所派生的父进程

因此,子进程看不到随后在父进程中发生的变量状态更新,因此其shell变量的视图严格地说是创建后台进程时存在的变量的视图


因此,
$date
的值将始终是
backgroundcommand&调用已发生,无论父进程是否已在之后更新了值。

backgroundcommandX-o$date&
将$date变量设置为迭代的值

您可能会遇到与
$date
变量相同的问题,因为date的粒度为1秒,如果您的循环执行不到1秒,则会使用相同的文件名

我会首先使用自定义格式来避免文件名中的空格,并可能在字符串中添加毫秒:

date +"%Y-%m-%d_%H_%M_%S_%N"
也可以在循环中添加暂停:

sleep 2

因此,您可以确定不会有两个类似的日期字符串。

BTW,因为您的命令(除了分配给
date
)是在后台运行的,所以三个
date
调用很可能都在同一秒内发生,因此在实践中具有相同的值。同样,您的循环将很快淹没进程表,并对系统的可用性产生不良影响,因为它会非常、非常快地启动后台进程。我正在尝试重复(无限次,因此
while true
)使用
rec
命令录制音频,直到检测到静音,然后将此音频发送到语音到文本API。不过,我不想让
curl
s阻止while循环,因为这意味着我错过了音频,所以我想在后台运行它们。然而,这可能会使
rec
输出覆盖自身,除非我将输出文件命名为唯一的名称,如日期。因此,在您的实际用例中,您会遇到一些阻塞。这比100%纯后台进程(而不是
date
)要合理得多。顺便说一句,在实践中,您希望
-o“$date”
而不是
-o$date
——这样变量总是精确地扩展到一个参数,不管该值是否包含
$IFS
中的字符(否则将用于将其拆分为多个参数)。