假设我有以下管道:
a | b | c | d
Run Code Online (Sandbox Code Playgroud)
我怎样才能在or 中等待c(或b)完成?这意味着该脚本可以开始任何时间(和它不是必须等待),但需要完整的输出正确地工作。shbashdc
用例是difftool用于git比较图像。它被调用git并需要处理其输入(a | b | c零件)并显示比较的结果(d零件)。调用者将删除a和所需的输入b。这意味着在从脚本返回之前,进程c(或b)必须终止。另一方面,我不能等待,d因为这意味着我正在等待用户输入。
我知道我可以将结果写入c临时文件,或者在bash. (不过,不确定 FIFO 是否会有所帮助。)是否可以在没有临时文件的情况下实现这一点sh?
编辑
如果我能以可靠的方式找出c(或b)进程的进程 ID,也许就足够了。然后整个管道可以异步启动,我可以等待进程 ID。类似的东西
wait $(a | b | { c & [print PID of c] ; } | d)
Run Code Online (Sandbox Code Playgroud)
编辑^2 …
我有一个令人尴尬的并行过程,它创建了大量几乎(但不完全)相同的文件。有没有办法“即时”存档文件,以便数据不会占用不必要的空间?
进程本身接受命令行参数并将创建的每个文件的名称打印到标准输出。我正在调用它,parallel --gnu它负责分配输入(来自另一个进程)和收集输出:
arg_generating_process | parallel --gnu my_process | magic_otf_compressor
Run Code Online (Sandbox Code Playgroud)
管道第一部分的简单示例bash:
for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done
Run Code Online (Sandbox Code Playgroud)
怎么可能magic_otf_compressor长得像?它应该将每个输入行视为文件名,将每个文件复制到压缩.tar存档(处理所有文件的存档相同!),然后将其删除。(实际上,打印每个处理文件的名称应该就足够了,另一个| parallel --gnu rm可以负责删除文件。)
有没有这样的工具?我不考虑单独压缩每个文件,这会浪费太多空间。我已经研究过archivemount(将文件系统保留在内存中 -> 不可能,我的文件太大太多)和avfs(无法让它与 FUSE 一起工作)。我错过了什么?
我离自己破解这样一个工具只有一步之遥,但之前肯定有人做过......
编辑:基本上我想我正在寻找一个标准输入前端libtar(而不是从命令行tar读取参数的命令行前端)。
我正在考虑设置一个 cronjob 来每隔一段时间获取我的所有存储库,以便在我离线时准备好当前状态。类似于以下内容(为了更好的可读性而包装):
find $HOME -name .git -type d -printf "%h\0" |
parallel --gnu -0 --delay 0.2 --jobs 100 --progress \
'cd {}; git fetch --all --quiet'
Run Code Online (Sandbox Code Playgroud)
我并不关心如果获取失败会发生什么——下次可能会成功。也许可以记录错误输出。我的问题是:
parallel使其真正安全吗?有没有办法在主显示器上显示辅助显示器内容的微型版本?这是为了在演示期间进行现场演示,同时保持双显示器设置以在主显示器上显示注释。我有一个模糊的感觉,这应该有可能以某种方式,但我没有与xrandr足够的经验。
粗略的互联网搜索没有发现任何有用的信息。我知道像 LibreOffice 的演示者模式或pdf-presenter-console. 这个问题是关于在辅助控制台上显示交互式内容。解决方案不需要涉及 xrandr,捕获屏幕的一部分并将其克隆到另一个窗口的实用程序也可以使用。
我在 Ubuntu 17.04 上。
bash ×1
cron ×1
fifo ×1
filesystems ×1
fuse ×1
git ×1
parallelism ×1
pipe ×1
screenshot ×1
shell ×1
tar ×1
ubuntu ×1
xrandr ×1