无法使用“打开*”

无法使用“打开*”

我尝试使用 `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)仍然不能保证opens 会发生得足够慢以适应当时的任意实用程序和系统负载;
  • 如果asdf*扩展到很多很多名称,整个循环可能会不必要地花费很长时间。

支持多个操作数的最简单方法open是内部运行等效循环。我们注意到的问题可能是尚未实现的原因。这是我的猜测尽管。


构建一个 shell 函数(或者等效脚本)并“重载”可能会很有用open,如下所示:

open() {
   for f do command open "$f"; done
}

sleep 1如果需要,请包括在内)。

这种方法有一个潜在的问题:像 这样的命令open --some-option foo bar将运行open --some-optionopen fooopen 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

相关内容