openlang

在 Pluto 内运行操作系统命令

能不能在 Pluto 里面调用外部操作系统命令,自动执行 fossil add fernuser/tiddlers/* 这一步,只把最后的提交留到控制台手动完成?

从英语翻译查看原文

后续讨论 3

顺着彼此的依据读下去
  1. 固定链接

    你好!可以,Julia 能执行 shell[1] (#footnote-731542-1) 命令,Pluto 笔记本也一样。比如,把下面的代码放进单元格,就会在类 Unix 系统上执行列出目录的命令 ls,

    run(`ls`)

    它先构造一个表示命令的 Cmd 类型对象,再通过 run 执行。run 和 Cmd 的文档还有很多有用的细节,介绍如何用这种方式执行命令。

    要注意,打开 Pluto 笔记本会执行所有单元格,而修改一个单元格时,依赖它的单元格也会重新执行。对于外部 shell 命令,这种行为是否合适取决于具体情况,不过也可以避免每次依赖变化时都执行这个“命令单元格”。

    附言,run 返回进程的结果,因此通常会显示输出,如果命令失败则会显示错误码。

    实际上,这些命令并不是通过 shell 执行的,下面的回复里有解释。↩︎ (#footnote-ref-731542-1)

    从英语翻译查看原文
  2. 固定链接

    不客气。我刚想起漏说了一点,在 Julia 中构造命令对象时,如果包含特殊字符(比如你例子中的 *),可能要特别小心。Julia 不会调用 shell,而是直接执行命令。因此 * 很可能不会按你预期的方式工作。

    比如,假设你要执行

    command = `fossil add fernuser/tiddlers/*`
    run(command)

    Julia 首先会对没有引号的 * 报错(要写成 \*),但改完也不会得到预期结果,因为把 * 匹配为目录中的所有文件名,是 Bash 等 shell 提供的“通配符展开”功能。run 不做这一步,可以看一下有关命令引用的讨论(https://discourse.julialang.org/t/quoting-in-shell-commands/6781),以及递归删除目录等相关讨论(https://discourse.julialang.org/t/removing-directory-contents-recursively/128761)。

    最直接的变通方式大概是明确通过 shell 执行这个命令,比如使用 bash -c '...'

    command = `bash -c 'fossil add fernuser/tiddlers/*'`
    run(command)

    这样应该就能得到所用 shell 的预期行为(假设是 Bash)。缺点是系统必须安装 Bash,不过如果没有,也很容易调整。

    从英语翻译查看原文

同一个问题的其他角度

  1. 通过 Google Colab 使用 MATLAB

    能在 Google Colab (云端的 Jupyter) 中使用 MATLAB 命令吗? 例如,我想在 Google Colab 中调用 Risk Management Toolbox 的函数,比如 bin(vbt, Name, Value)、tb…

    回复 2最近活动 matlab
  2. gdb 能否按地址在汇编指令处设置断点?

    我的尝试如下。 不过,看起来并不存在这条命令。 gdb 能实现这样的功能吗?

    回复 2最近活动 assembly
  3. Playwright 断言能否允许两个文本值中的任意一个?

    我想验证文本中包含 one 或 two。 在 Playwright 中能这样实现吗? 同样的写法也能用在句子内部吗,比如下面这样

    回复 2最近活动 typescript