如何更改在Julia中执行的命令的CWD?

时间:2017-04-11 09:36:12

标签: shell julia

Julia不像其他语言一样使用shell running external programs。如何在朱莉娅中完成cd temp_dir && some_cmd的等效操作?据我所知cd()全局更改工作目录,如果我并行执行代码块,则会出现问题。

3 个答案:

答案 0 :(得分:1)

查看cd函数的文档字符串:

help?> cd
search: cd Cdouble gcd gcdx secd vecdot asecd cld Cmd codeunit CodeInfo

  cd(dir::AbstractString=homedir())

  Set the current working directory.

  cd(f::Function, dir::AbstractString=homedir())

  Temporarily changes the current working directory and applies function f
  before returning.

我们可以将cd的第二种方法用于目录,运行命令,然后继续执行。

julia> cd(readdir, "temp_dir/")
2-element Array{String,1}:
 "code.jl" 
 "file.txt"

julia> cd("temp_dir/") do
           mkdir("subdir")
       end

julia> cd(readdir, "temp_dir/")
3-element Array{String,1}:
 "code.jl" 
 "file.txt"
 "subdir"  

我们可以将任何函数作为第一个参数传递,包括自定义函数(使用do块简洁地编写)。

答案 1 :(得分:0)

可以安全地用于并发任务的选项是setenv(cmd, dir=some_working_dir)。这将创建一个Cmd对象,该对象将在子进程中获得some_working_directory,而不会干扰Julia会话中的工作目录。

例如,

julia> run(setenv(`ls`, dir="temp_dir"))
code.jl  file.txt
Process(setenv(`ls`; dir="temp_dir"), ProcessExited(0))

答案 2 :(得分:0)

我想出了一个让 shell 用户开心的方法。

随便写

run(`bash -c """cd temp_dir && some_cmd"""`)

我们很好!

这种方法的好处是这些子壳是独立的。例如,我想要一个外部程序来为我生成力场,就像在分子动力学模拟中一样。我需要生成一种逐点数据的基调。我会并行编写它(使用 Threads)。 Julia 中的 cd 函数会以某种方式更改所有线程的工作目录,而在上面给出的解决方案中,它是线程安全的。