openlang

Запуск команд ОС внутри Pluto

Можно ли вызывать внешние команды операционной системы из Pluto, чтобы автоматизировать действие fossil add fernuser/tiddlers/* и оставить для ручного выполнения в консоли только заключительный коммит?

Переведено с английскогоПоказать оригинал

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Привет! Да, Julia умеет выполнять команды оболочки[1] (#footnote-731542-1), а значит, умеют и блокноты Pluto. Например, ячейка со следующим кодом запускает команду просмотра каталога ls в Unix-подобных системах:

    run(`ls`)

    Она создаёт представляющий команду объект типа Cmd, а затем выполняет его функцией run. В документации run и Cmd есть много полезных подробностей о том, как выполнять команды этим способом.

    Учтите, что при открытии блокнота Pluto выполняются все ячейки, а изменение ячейки повторно запускает и зависящие от неё ячейки. Для внешних команд оболочки это может быть как удобно, так и нежелательно, но можно избежать запуска такой “командной ячейки” при каждом изменении её зависимости.

    PS: run возвращает результат процесса, поэтому обычно вы видите его вывод или коды ошибок, если команда завершилась неудачно.

    На самом деле эти команды не выполняются через оболочку, как объясняется в моём ответе ниже. ↩︎ (#footnote-ref-731542-1)

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Всегда пожалуйста. Я только что заметил, что упустил одну подробность: создавая объект команды в Julia, нужно быть особенно осторожным со специальными символами (например, с * из вашего примера). Julia не вызывает оболочку, а выполняет команды напрямую. Поэтому *, вероятно, сработает не так, как вы ожидаете.

    Например, допустим, вы пытаетесь выполнить

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

    Сначала Julia жалуется на неэкранированный * (нужно написать \*), но даже после исправления нужного результата не будет, поскольку сопоставление * с именами файлов в каталоге — это “globbing”, который предоставляют Bash и другие оболочки. run этого не делает, см., например, обсуждение экранирования команд (https://discourse.julialang.org/t/quoting-in-shell-commands/6781) и связанные обсуждения, в том числе рекурсивного удаления каталогов (https://discourse.julialang.org/t/removing-directory-contents-recursively/128761).

    Самый простой обходной путь, вероятно, состоит в явном выполнении команды через оболочку, например с помощью bash -c '...'

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

    Тогда вы получите ожидаемое поведение используемой оболочки (если это Bash). Правда, Bash должен быть установлен в системе, но при необходимости это легко адаптировать.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Использование MATLAB через Google Colab

    Можно ли использовать команды MATLAB из Google Colab (облачного Jupyter)? Например, хотелось бы вызывать из Google Colab функ…

    Ответы 2Последняя активность matlab
  2. Может ли gdb поставить точку останова на инструкцию ассемблера по адресу?

    Моя попытка: но, похоже, такой команды не существует. Может ли gdb сделать что-то подобное?

    Ответы 2Последняя активность assembly
  3. Может ли проверка Playwright допускать один из двух текстов?

    Хочу проверить, содержит ли текст one либо two: Можно ли заставить это работать в Playwright? И можно ли сделать то же самое…

    Ответы 2Последняя активность typescript