我尝试使用 `open *` 同时打开两个具有相同文件名前缀的文件。下面是一个演示:
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$ touch asdf1.txt asdf2.txt
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$ open asdf*
xdg-open: unexpected argument 'asdf2.txt'
Try 'xdg-open --help' for more information.
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$ open asdf1.txt
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$ open asdf2.txt
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$
如上所示,我无法同时打开两个文件,但可以单独打开它们。如果这相关的话,我已将默认文本编辑器设置为 sublime text。此外,我正在运行 ubuntu 版本 22.04,如下所示:
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy
mathewlewis@mathewlewis-ThinkPad-X220:~/Documents/bug/testing$
我通常可以*
同时执行多个命令。例如,我可以cat asdf*
打印两个文件,但是打开无法以这种方式工作。我是 Linux 新手,来自可以做到这一点的 Mac。我想知道为什么我不能在 ubuntu 上做到这一点以及如何解决这个问题。
答案1
壳在膨胀(或不) asdf*
。调用时open asdf*
,open
获取扩展的结果。在您的例子中,它至少获取两个操作数。
因此,问题在于单个是否open
可以处理多个操作数。open
在 Ubuntu 中不能;但显然(我相信你的话)open
在 Mac 中可以。
open
一个简单的解决方法是在循环中每个文件运行一次:
for f in asdf*; do open "$f"; done
由于open
不等待它运行的程序关闭,它们中的许多可能异步生成,可能太快了。我完全不知道open
在 Mac 中使用多个参数是否也是这样。在我使用许多文本文件的测试中(在 Kubuntu 中), (文本编辑器)通常在第一次调用后很快第二次调用,导致至少有两个单独的 Kate 窗口,并且其中一个窗口中只有多个选项卡。理想情况下,它应该是一个窗口和多个选项卡。一个简单的解决方法是在skate
之间休眠一段时间:open
for f in asdf*; do open "$f"; sleep 1; done
但:
- 这(或任何
sleep N
)仍然不能保证open
s 会发生得足够慢以适应当时的任意实用程序和系统负载; - 如果
asdf*
扩展到很多很多名称,整个循环可能会不必要地花费很长时间。
支持多个操作数的最简单方法open
是内部运行等效循环。我们注意到的问题可能是尚未实现的原因。这是我的猜测尽管。
构建一个 shell 函数(或者等效脚本)并“重载”可能会很有用open
,如下所示:
open() {
for f do command open "$f"; done
}
(sleep 1
如果需要,请包括在内)。
这种方法有一个潜在的问题:像 这样的命令open --some-option foo bar
将运行open --some-option
,open foo
而open bar
不是open --some-option foo
,而open --some-option bar
你可能想要 。为了解决这个问题,函数需要解析其参数并像 real 一样“理解”它们。显然,如果 real在内部完成所有工作open
会更好。open
另一方面man 1 open
(在我的 Kubuntu 中)仅提到--help
,--manual
并且--version
独家的选项;它们都不能用文件/URL 操作数指定。这意味着在我们的函数中解析选项是没有意义的,因为open --some-option foo
无论如何都是无效的。该函数本身就更好了。
答案2
GNU parallel
对于这个特定的用例来说可能有点过度,但它可以做到这一点:
parallel xdg-open {} ::: asdf*.txt