Shell通配符在Julia的Shell模式下无法使用。

5
当我运行IPython时,我可以在任何需要的shell命令前加上惊叹号来执行它:
In [1]: !ls
file1  file2  file3  file4

In [2]: !ls file*
file1  file2  file3  file4

然而,有些东西(特别是通配符的使用)在Julia REPL的shell模式下不起作用(在您键入分号后)。
shell> ls file
file1 file4  file2  file3
shell> ls file*
ls: cannot access 'file*': No such file or directory

我有所疑问,是否有一种方法可以使通配符在Linux shell中像平常一样运行?

2个回答

5

你说得没错,Julia shell REPL 模式并不是大多数人期望的 "shell"(命令行解释器)。关于这个话题的一些讨论可以在 这里这里 找到。目前,参数以原样传递,没有 shell 展开, 因此如果程序支持字面意义上的 '*' ,那就可以正常工作:

shell> find -iname *
.
./file1
./file2
./file3
./file4

如果不行,您需要找到另一种方法。比如通过Bash进行调用:
shell> bash -c 'ls *'
file1  file2  file3  file4

或者使用Julia函数/宏:

julia> bash(str::String) = run(`bash -c $str`)
bash (generic function with 1 method)

julia> macro sh_str(str::String)
       bash(str)
       end

julia> sh"ls *"
file1  file2  file3  file4
Process(`bash -c 'ls *'`, ProcessExited(0))

2
仅为补充这个优秀的答案,不使用 shell 扩展的原因是这样你就不依赖于系统 shell,从而使你的程序更具可移植性。调用 bash 的技巧只有在你拥有 bash 的情况下才有效。正如答案中链接的问题之一所提到的那样,原则上可以在 Julia 的命令解析中添加常见的 Unix shell 功能(如 globbing、I/O 重定向等),但需要以跨平台的方式完成(即,不实际调用系统的 shell)。 - giordano
谢谢解释。我仍然不明白为什么REPL不能简单地将在“;”后键入的任何内容放入机器的shell中(无论是shell还是其他)。然后由用户使用其shell的正确命令。据我所知,IPython在所有系统中都非常成功地实现了这一点。 - TomCho

0

这里可以工作(Windows 10 with Win-builds ls)。您可以尝试在Python和Julia shell中运行ls --version命令。您的文件是否位于Python根目录而非Julia根目录下?

shell> ls --version
ls (GNU fileutils) 3.16

shell> ls file*
file1.txt  file2.txt  file3.txt  file4.txt

Python和Julia具有相同的“ls”版本:“ls(GNU coreutils)8.32”。 - TomCho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接