Piper — запуск консольных программ с передачей input и удобным доступом к output

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 13900
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 75 times
Been thanked: 431 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by John Doe »

На основе Execute ⓒ zg

Преимущества:
  • можно передать данные через input stream.
  • output можно получить как сразу целиком, так и частями (построчно, или произвольными кусками, по мере их доступности).
  • Для доступа к частям используются итераторы (что для lua идиоматичнее колбеков как в Execute)
  • опционально: output форматируется под заданную ширину
  • доступен код возврата программы
  • предусмотрена обработка ошибок
Executes a specified command, putting the specified text to it's input stream, and providing convenient access to the command's output/err. Syntax: obj = sh.piper(cmdline [,options]) cmdline: a string specifying the command to be executed options: a table with optional keys: - directory: a string specifying the working directory for the command - input: a string representing the text to be provided as input to the command - isOem: a boolean, if true then CP en-/decoding performed - linewrap: a number specifying the maximum width for each line of output obj: a table with the following keys: - all: a string containing all the output generated by the executed command - chunks: an iterator function that returns the output in raw chunks - lines: an iterator function that returns the output line by line - streamlines: an iterator function that returns the output line by line in a stream-like manner. It adds more data to each line as it becomes available. The iterator keeps returning the same line with more data until it is complete, and then adds a second `true` value to indicate completion. - ExitCode: an integer representing the exit code of the command (obtained from GetExitCodeProcess)
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13900
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 75 times
Been thanked: 431 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by John Doe »

Latest post of the previous page:

Для простых случаев по коду возврата можно предположить когда вывод содержит сообщение об ошибке.

Если же оба потока штатно могут содержать вывод, то это другое дело.
https://t.me/FarManager — Telegram чат
User avatar
HaRT
Moderator
Posts: 10903
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 223 times
Been thanked: 359 times

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by HaRT »

John Doe wrote: Tue 16 Apr, 2024 00:18 Если же оба потока штатно могут содержать вывод, то это другое дело.
В случае с транслятором ещё как могут. Например, компиляторы семейства gcc (а также многие другие) при определённых ключах командной строки на stdout выводят собственно результат трансляции (который попросили, есть варианты), а на stderr — диагностику, например, предупреждения и всякие заметки, что к чему (даже при отсутствии ошибок).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4298
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 647 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by buniak_a_h »

HaRT, ну да; уже не стал писать, но полностью согласен.
User avatar
HaRT
Moderator
Posts: 10903
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 223 times
Been thanked: 359 times

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by HaRT »

John Doe wrote: Tue 16 Apr, 2024 00:18 Если же оба потока штатно могут содержать вывод, то это другое дело.
Ещё один распространённый случай — какая-нибудь качалка, которая на stdout пишет то, что качает, а на stderr — прогресс.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13900
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 75 times
Been thanked: 431 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by John Doe »

Ни капли не сомневаюсь что так бывает.
Вопрос в том востребовано ли это в фаре.
И в каком именно виде.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4298
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 647 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by buniak_a_h »

John Doe, у меня пара-тройка вопросов (извините, если глупых)
  1. Что такое переменная _cmdline? В энциклопедии не нашёл. _filename - есть, а _cmdline нету. Параметр в функции pipe (строка 221) наpывается command
  2. Что такое таблица sh? У Вас в примерах везде фигурирует вызов sh.pipe(…).
  3. Правильно ли я понимаю, что указанный файл может быть как модулем, подключаемым по require, так и отдельным скриптом, вызываемым из комстроки примерно так: lua:@execute.lua <command>? И если я прав, напишите, пож., как выглядит команда require (меня по-прежнему смущает sh).
User avatar
HaRT
Moderator
Posts: 10903
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 223 times
Been thanked: 359 times

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by HaRT »

buniak_a_h wrote: Tue 16 Apr, 2024 08:50 Что такое таблица sh?
Если я правильно понимаю, отсюда: LuaShell — запуск lua/moon скриптов из командной строки. Там же её документация и примеры использования, вероятно, отвечающие на ваш вопрос 3 (а возможно и 1).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13900
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 75 times
Been thanked: 431 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by John Doe »

Всё просто: require("piper")

Всё остальное вас может интересовать только если используете Luashell
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4298
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 647 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by buniak_a_h »

HaRT, John Doe, спасибо. Никогда не пользовался LuaShell, . Отсюда дополнительный вопрос: а без LuaShell работать будет?
John Doe wrote: Tue 16 Apr, 2024 09:37 Всё просто: require("piper")
Наверно, require"execute" (файл так называется).
На самом деле можете не отвечать. Я сам выясню. Квалификация пока позволяет… :sad:
Last edited by buniak_a_h on Tue 16 Apr, 2024 10:57, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13900
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 75 times
Been thanked: 431 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by John Doe »

Файл переименован, поэтому piper.
Да, будет и без luashell
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4298
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 647 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by buniak_a_h »

John Doe wrote: Tue 16 Apr, 2024 11:07 Файл переименован
Тогда я, видимо, не оттуда скачиваю. Во втором сообщении ссылка на архив. Внутри - execute.lua
User avatar
John Doe
Бюрократ
Posts: 13900
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 75 times
Been thanked: 431 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by John Doe »

Забыл там переименовать. Исправил.
https://t.me/FarManager — Telegram чат
User avatar
zg
zero-gravity
Posts: 6054
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 186 times
Contact:

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by zg »

HaRT wrote: Tue 16 Apr, 2024 00:25 В случае с транслятором ещё как могут. Например, компиляторы семейства gcc (а также многие другие) при определённых ключах командной строки на stdout выводят собственно результат трансляции (который попросили, есть варианты), а на stderr — диагностику, например, предупреждения и всякие заметки, что к чему (даже при отсутствии ошибок).
по умолчанию так, без всяких ключей. я свой модуль писал и до сих пор использую для того, чтобы вывод показать в виде меню и перейти на место ошибки. и в простых случаях хватает stderr, но в сложных stdout помогает и при этом в простых — не особо мешает.
возможно, если весь вывод обрабатывается автоматически, то разделение полезно, но я с таким не сталкивался.
User avatar
HaRT
Moderator
Posts: 10903
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 223 times
Been thanked: 359 times

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by HaRT »

Last edited by HaRT on Tue 16 Apr, 2024 23:08, edited 1 time in total.
Reason: Добавлен постскриптум
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 10903
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 223 times
Been thanked: 359 times

Piper — запуск консольных программ с передачей input и удобным доступом к output

Post by HaRT »

zg wrote: Tue 16 Apr, 2024 12:51 возможно, если весь вывод обрабатывается автоматически, то разделение полезно, но я с таким не сталкивался
Ситуации, когда вывод компилятора нужно сразу отправить в дальнейшую обработку, бывают, и в таких случаях иногда не хочется затеваться даже с временным файлом, поэтому разумно сразу через пайп перенаправить. Примеры (несколько надуманные, но близкие к практическим): (1) просим компилятор вывести дерево зависимостей от заголовочников, а в нём вычленяем окрестности интересующих нас; (2) просим компилятор вывести ассемблерный код, а в нём смотрим только на использование определённых команд; и т.п.

Если же говорить не про трансляторы, а про конвертацию форматов (т.е. более общий случай), то преобразование в два приёма вовсе не редкость, а диагностику видеть всё равно нужно, чтобы контролировать процесс.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

Return to “Полезные макросы и скрипты”