Linux 从bash中的循环开始的后台进程能否从以后的迭代中获取值?
在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首次执行
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
中的字符(否则将用于将其拆分为多个参数)。