- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 bash
脚本中,我想将 times
内置函数的输出分配给一个数组变量,但我发现没有比
tempnam=/tmp/aaa_$$_$RANDOM
times > ${tempnam}
mapfile -t times_a < ${tempnam}
我将输出写入一个临时文件并在数组 times_a 中读回它,因为管道或 $(times)
会在子 shell 中执行并返回错误的值。
没有临时文件有更好的解决方案吗?
最佳答案
您需要解决的根本问题是如何在同一个 shell 中同时执行 time
和变量赋值,而无需临时文件。几乎 Bash 提供的每一种方法,将一个事物的输出通过管道传输到另一个事物,或捕获命令的输出,都有一方在子 shell 中工作。
这是一种不需要临时文件就可以做到的方法,但我要警告你,它不漂亮,不能移植到其他 shell,而且它至少需要 Bash 4:
coproc co { cat; }; times 1>&${co[1]}; eval "exec ${co[1]}>&-"; mapfile -tu ${co[0]} times_a
我会为你分解一下:
coproc co { cat; }
这会创建一个协程;一个在后台运行的进程,但是你可以通过管道与它的标准输入和标准输出进行通信,它们是 FDs ${co[0]}
(标准输出 cat
) 和 ${co[1]}
(cat
的标准输入)。命令在子 shell 中执行,所以我们不能在那里完成我们的任何一个目标(运行 times
或读入变量),但我们可以使用 cat
来只需将输入传递到输出,然后使用该管道与当前 shell 中的 times
和 mapfile
对话。
times >&${co[1]};
运行 times
,将其标准输出重定向到 cat
命令的标准输入。
eval "exec ${co[1]}>&-"
关闭cat
命令的输入端。如果我们不这样做,cat
将继续等待输入,保持其输出打开,而 mapfile
将继续等待,导致您的 shell 挂起。 exec
,当没有传递任何命令时,只是将其重定向应用到当前 shell;重定向到 -
关闭 FD。我们需要使用 eval
因为 Bash 似乎在 exec ${co[1]}>&-
上有问题,将 FD 解释为命令而不是重定向的一部分;使用 eval
允许先替换该变量,然后再执行。
mapfile -tu ${co[0]} times_a
最后我们实际上从协进程中读取了标准的数据。我们已经成功地在这个 shell 中运行了 times
和 mapfile
命令,并且没有使用临时文件,尽管我们确实使用了一个临时进程作为两者之间的管道命令。
请注意,这有一个微妙的竞争。如果您一条一条地执行这些命令,而不是全部作为一条命令执行,那么最后一条会失败;因为当您关闭 cat
的标准时,它会退出,从而导致协进程退出并关闭 FD。看起来当全部在一行上执行时,mapfile
的执行速度足够快,以至于协进程在运行时仍然处于打开状态,因此它可以从管道中读取;但我可能会走运。我还没有找到解决这个问题的好方法。
总而言之,写出临时文件要简单得多。我会使用 mktemp
生成一个文件名,如果您在脚本中,添加一个陷阱以确保您在退出前清理您的临时文件:
tempnam=$(mktemp)
trap "rm '$tempnam'" EXIT
times > ${tempnam}
mapfile -t times_a < ${tempnam}
关于Bash:将内置的 'times' 的输出分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370318/
我有一个应用程序,它会抛出 GKSession 并在各种条件下(连接超时、 session 失败等)创建一个新的 GKSession。不过,我遇到了内存泄漏问题,并且有时会在重新连接几次循环后崩溃。
比如我在宿主代码中有一个浮点指针 float *p 是否可以确定他指向的内存类型(设备/主机)? 最佳答案 在 UVA system 中, 运行时 API 函数 cudaPointerGetAttri
我已将项目转换为 .Net 4.0 并且以下代码不起作用: typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Instance
当我声明 char ch = 'ab' 时,ch 只包含 'b',为什么它不存储 'a'? #include int main() { char ch = 'ab'; printf("%c"
我对 Disk Sector 和 Block 有疑问。扇区是一个单位,通常为 512 字节或 1k、2k、4k 等取决于硬件。文件系统 block 大小是一组扇区大小。 假设我正在存储一个 5KB 的
假设我有 8 个人和5000 个苹果。 我想将所有苹果分发给所有 8 个人,这样我就没有苹果了。 但每个人都应该得到不同数量 将它们全部分发出去的最佳方式是什么? 我是这样开始的: let peopl
我正在构建的网站顶部有一个搜索栏。与 Trello 或 Gmail 类似,我希望当用户按下“/”键时,他们的焦点就会转到该搜索框。 我的 JavaScript 看起来像这样: document.onk
我有一小段代码: if (PZ_APP.dom.isAnyDomElement($textInputs)){ $textInputs.on("focus", function(){
我观察到以下行为。 接受了两个属性变量。 @property (nonatomic, retain) NSString *stringOne; @property (nonatomic, assign
我正在解决这样的问题 - 实现一个计算由以下内容组成的表达式的函数以下操作数:“(”、“)”、“+”、“-”、“*”、“/”。中的每个数字表达式可能很大(与由字符串表示的一样大)1000 位)。 “/
我有一组主机和一组任务。 每个主机都有 cpu、mem 和任务容量,每个任务都有 cpu、mem 要求。 每个主机都属于一个延迟类别,并且可以与具有特定延迟值的其他主机通信。 每个任务可能需要以等于或
该程序的作用:从文件中读取一个包含 nrRows 行和 nrColomns 列的矩阵(二维数组)。矩阵的所有元素都是 [0,100) 之间的整数。程序必须重新排列矩阵内的所有元素,使每个元素等于其所在
世界!我有个问题。今天我尝试创建一个代码,它可以找到加泰罗尼亚语号码。但是在我的程序中可以是长数字。我找到了分子和分母。但我不能分割长数字!此外,只有标准库必须在此程序中使用。请帮帮我。这是我的代码
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
这个问题在这里已经有了答案: Difference between self.ivar and ivar? (4 个答案) 关闭 9 年前。
我如何将 v[i] 分配给一系列整数(v 的类型是 vector )而无需最初填充 最佳答案 你的意思是将 std::vector 初始化为一系列整数? int i[] = {1, 2, 3, 4,
我想寻求分配方面的帮助....我把这个作业带到了学校......我必须编写程序来加载一个 G 矩阵和第二个 G 矩阵,并搜索第二个 G 矩阵以获取存在数第一个 G 矩阵的......但是,当我尝试运行
我必须管理资源。它基本上是一个唯一的编号,用于标识交换机中的第 2 层连接。可以有 16k 个这样的连接,因此每次用户希望配置连接时,他/她都需要分配一个唯一索引。同样,当用户希望删除连接时,资源(号
是否有任何通用的命名约定来区分已分配和未分配的字符串?我正在寻找的是希望类似于 us/s 来自 Making Wrong Code Look Wrong ,但我宁愿使用常见的东西也不愿自己动手。 最佳
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。 感谢您的帮助。 我的程序只分配文件的第一个字... 我知道问题出在函数 i
我是一名优秀的程序员,十分优秀!