Там используются сантисекундные задержки и ввод производится с помощью set /p и одного хитрого трюка (сам еще не до конца понял его) "%~F0" Input >> pipeFile.txt | "%~F0" Main < pipeFile.txt.
Интересно Ваша реализация следующего пути документообновления.
Вы (команда или один человек) готовите документ в asciidoc, затем собираете в формат docx и передаете заказчику (внешний или внутрении) на рассмотрение. Он редактирует документ, добавляет комментарии "на полях" (в которых часто выносятся новые мысли или предполагаемые предложения к правкам) и высылает обновленный docx файл.
И теперь вопросы. Есть ли возможность перевести изменения в репозиторий из формата docx снова в формат asciidoc? Есть возможность не потерять эти комментарии и принять их во внимание?
Если симлинка будет не на директорию, а на сам скрипт, то с ваш пример не сработает.
Согласен.
Про catecho все равно не очень понятно.
Вы все верно поняли. Это не то чтобы разное поведение, это одинаковый, единообразный вывод.
В примере выше я привел функцию logMsg, которая используют особенности catecho. С их помощью и с помощью других функций (как, например, warn из второго примера выше) можно единообразно логгировать. Здесь, 1-ый и 2-ой примеры взаимозаменяемы, но 1-ый, по мнению автора, элегантнее.
realpath нужно если скрипт вызывается через симлинку, а надо подгружать что-то лежащее непосредственно рядом со скриптом.
Не вижу проблем. Ну, если какие-то особые редкие случаи в экзотических дистрибутивах или в макоси, с которыми я не сталкивался.
Вот пример
$ cat /opt/scripts/test/z
#!/usr/bin/env bash
set -x
. "$( dirname "$0" )/z.sh"
blabla
$ cat /opt/scripts/test/z.sh
blabla() {
echo "Hello! I am $FUNCNAME"
}
$ sudo ln -s /opt/scripts/test /test
$ /test/z
++ dirname /test/z
+ . /test/z.sh
+ blabla
+ echo 'Hello! I am blabla'
Hello! I am blabla
про catecho
Ваш вопрос заставил меня немного задуматься. И я вспомнил, откуда ноги растут у этой функции. Это кусок кода для логирования всего с разными уровнями (DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL). Не скажу, что в catecho сейчас есть большая нужда. Исторически так сложилось, что эта функция перетекает из одного скрипта в другой.
Вот небольшой фрагмент и несколько гипотетических примеров. Понятно, что echo "..." это просто заглушки для примеров, на самом деле - там какие-то внешние команды или функции. Первый пример, явно, избыточен - он легко перекрывается вторым, но первый виделся мне тогда и видится сейчас элегантнее, чем второй.
function logMsg()
{
local level="$1"
shift
catecho "$@" \
| sed "s|^|$(date '+%Y/%m/%d %H:%M:%S') ($$) ($level): |"
}
function warn()
{
logMsg "WARNING" "$@"
}
echo "какая-то-команда неожиданно что-то напечатала" | warn
# DATE TIME (PID) (WARNING): какая-то-команда неожиданно что-то напечатала
warn "$( echo "какая-то-команда снова что-то напечатала" )"
# DATE TIME (PID) (WARNING): какая-то-команда снова что-то напечатала
warn "какие-то проблемы - надо что-то напечатать"
# DATE TIME (PID) (WARNING): какие-то проблемы - надо что-то напечатать
Думаю, что для определения "домашнего" каталога скрипта цепочку dirname/realpath можно опустить и оставить только dirname.
Во многих своих скриптах я часто использу такое подобие шаблона. Некоторые определения могут отсутствовать. Кое-что добавляется в зависимости от задачи. Функции die/warn/catecho - для удобства вывода диагностических сообщений и аварийного прекращения.
#!/usr/bin/env bash
readonly ME="$( basename "$0" )"
readonly MYDIR="$( dirname "$0" )"
print_help() {
cat - <<HELP
USAGE
$ME [OPTIONS]
OPTIONS
bla-bla
HELP
}
main() {
init
parse_options "$@"
# do payload
}
init() {
# preparations and initialization
# set trap if needs
}
parse_options() {
while [ $# -gt 0 ]
do
# parse CLI options
done
}
# own functions' definitions doing the script payload
die() {
warn "$@"
exit 1
}
warn() {
catecho "$@" >&2
}
catecho() {
[ -t 0 ] && echo "$@" || cat -
}
main "$@"
Есть большая компания, которая продает крутое, сложое и капризное устройство, которое надо постянно чинить. И она с этого имеет неплохую прибыль. Есть крохотная компания, которая выпускает крохотное устройство, которое путем реверс-инжиниринга сокращает расходы на починку и обслуживание сложного устройства. Большая компания раздобыло маленькое устройство и, видимо, взломало его. Теперь маленькая компания хочет судиться с большой компанией.
Экселевские таблицы давно напрашиваются как хранилище паролей. Но зависимость от большой (как части еще большего пакета) и небесплатной программы сдерживает.
exa (examine) — скорее экспрессивное "че за...?!"
ls (list) — скорее нейтральное "а хто тута?"
Имел случай, когда по какой-то причине в некотором каталоге накопилось более 40К файлов. ls — падал, даже ls -Uне помог, только find -type f. Интересно, в таком разрезе, как некоторые из предлагаемых, несомненно прекрасных, утилит справляются с такими проблемами?
Красиво, но пёстровато. У всех этих утилит есть несомненно большой недостаток — они написаны на достаточно экзотическом языке и требуют отдельной установки, которого по умолчанию в системе нет. Мне встречались системы без perl, хотя, к счастью, там были команды из "великой тройки", то есть grep/sed/awk.
Исходный "код" документа находится в команде, на выходе получается красивый, скопилированный doc/docx/odt, годный для чтения.
Читатели (руководство, заказчики) читают "красивый" документ, вносят правки, комментарии, возвращают в команду. И теперь стоит задача, "декомпилировать" правленный документ в исходники, но так чтобы были внесены только правки (что-то удалили, что-то добавили, что-то исправили, или, дополнительно, что-то прокомментировали).
Команда принимает во внимание комментарии, принимает правки, возможно, вносит доп.правки, сохраняет и генерироует новый документ.
Когда-то давно я задумывался можно ли это сделать с помощью markdown, но быстро понял, что с ним не получится. Возможно asciidoc или другой формат в этом плане лучше.
Но мне видится еще проблема таблиц с многострочными текстами в ячейках. Кажется, ни один из форматов такого не поддерживают.
> Для ввода используется xcopy /W
Теперь все понятно. Я видел эту команду, но потом забыл о ней и все не мог понять как set /p принимает ввод клавиш без ожидания.
Посмотрите здесь: https://www.dostips.com/forum/viewtopic.php?f=3&t=6812
Там используются сантисекундные задержки и ввод производится с помощью
set /p
и одного хитрого трюка (сам еще не до конца понял его)"%~F0" Input >> pipeFile.txt | "%~F0" Main < pipeFile.txt
.Интересно Ваша реализация следующего пути документообновления.
Вы (команда или один человек) готовите документ в asciidoc, затем собираете в формат docx и передаете заказчику (внешний или внутрении) на рассмотрение. Он редактирует документ, добавляет комментарии "на полях" (в которых часто выносятся новые мысли или предполагаемые предложения к правкам) и высылает обновленный docx файл.
И теперь вопросы. Есть ли возможность перевести изменения в репозиторий из формата docx снова в формат asciidoc? Есть возможность не потерять эти комментарии и принять их во внимание?
Подобное обсуждалось здесь в коментариях к серии статей под общим названием "Asciidoc для подготовки сложной документации", например https://habr.com/ru/post/550086/comments/#comment_22886324.
На идеях, изложенных в статье, пишутся скрипты-полиглоты (другие названия: скрипты-гибриды, скрипты-химеры). А еще скрипты - генераторы таких скриптов
https://github.com/ildar-shaimordanov/cmd.scripts/blob/master/cmdize.bat
Davide
И произносится ближе к Давидэ.
Согласен.
Вы все верно поняли. Это не то чтобы разное поведение, это одинаковый, единообразный вывод.
В примере выше я привел функцию
logMsg
, которая используют особенностиcatecho
. С их помощью и с помощью других функций (как, например,warn
из второго примера выше) можно единообразно логгировать. Здесь, 1-ый и 2-ой примеры взаимозаменяемы, но 1-ый, по мнению автора, элегантнее.Промахнулся кнопкой "Ответить". Мой ответ Вам - ниже.
Не вижу проблем. Ну, если какие-то особые редкие случаи в экзотических дистрибутивах или в макоси, с которыми я не сталкивался.
Вот пример
Ваш вопрос заставил меня немного задуматься. И я вспомнил, откуда ноги растут у этой функции. Это кусок кода для логирования всего с разными уровнями (DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL). Не скажу, что в
catecho
сейчас есть большая нужда. Исторически так сложилось, что эта функция перетекает из одного скрипта в другой.Вот небольшой фрагмент и несколько гипотетических примеров. Понятно, что
echo "..."
это просто заглушки для примеров, на самом деле - там какие-то внешние команды или функции. Первый пример, явно, избыточен - он легко перекрывается вторым, но первый виделся мне тогда и видится сейчас элегантнее, чем второй.Думаю, что для определения "домашнего" каталога скрипта цепочку dirname/realpath можно опустить и оставить только dirname.
Во многих своих скриптах я часто использу такое подобие шаблона. Некоторые определения могут отсутствовать. Кое-что добавляется в зависимости от задачи. Функции die/warn/catecho - для удобства вывода диагностических сообщений и аварийного прекращения.
Название сайта - эдакая "смесь французского с нижегородским". Как правильно прочитать? майсказка? мисказка? мысказка? или даже мусказка?
Есть большая компания, которая продает крутое, сложое и капризное устройство, которое надо постянно чинить. И она с этого имеет неплохую прибыль. Есть крохотная компания, которая выпускает крохотное устройство, которое путем реверс-инжиниринга сокращает расходы на починку и обслуживание сложного устройства. Большая компания раздобыло маленькое устройство и, видимо, взломало его. Теперь маленькая компания хочет судиться с большой компанией.
Вижу, второй пункт из списка проблем аккумулирует наше с Вами обсуждение в ранее упомянутой теме.
По нарастанию гибкости использования: алиасы, шелл-функции, шелл-скрипты.
Экселевские таблицы давно напрашиваются как хранилище паролей. Но зависимость от большой (как части еще большего пакета) и небесплатной программы сдерживает.
И даже
cat
лишний:Как Вы сложно выразились в субшелле. Можно ж было проще, например так:
Sponge легко эмулируется с помощью awk, также perl, который есть почти всегда, и python и другими, которые иногда уже установлены по умолчанию.
Например, https://github.com/ildar-shaimordanov/perl-utils#sponge
Посмею добавить свое смешное мнение.
exa (examine) — скорее экспрессивное "че за...?!"
ls (list) — скорее нейтральное "а хто тута?"
Имел случай, когда по какой-то причине в некотором каталоге накопилось более 40К файлов.
ls
— падал, дажеls -U
не помог, толькоfind -type f
. Интересно, в таком разрезе, как некоторые из предлагаемых, несомненно прекрасных, утилит справляются с такими проблемами?Красиво, но пёстровато. У всех этих утилит есть несомненно большой недостаток — они написаны на достаточно экзотическом языке и требуют отдельной установки, которого по умолчанию в системе нет. Мне встречались системы без perl, хотя, к счастью, там были команды из "великой тройки", то есть grep/sed/awk.
Да. Вы верно понимаете.
Исходный "код" документа находится в команде, на выходе получается красивый, скопилированный doc/docx/odt, годный для чтения.
Читатели (руководство, заказчики) читают "красивый" документ, вносят правки, комментарии, возвращают в команду. И теперь стоит задача, "декомпилировать" правленный документ в исходники, но так чтобы были внесены только правки (что-то удалили, что-то добавили, что-то исправили, или, дополнительно, что-то прокомментировали).
Команда принимает во внимание комментарии, принимает правки, возможно, вносит доп.правки, сохраняет и генерироует новый документ.
Когда-то давно я задумывался можно ли это сделать с помощью markdown, но быстро понял, что с ним не получится. Возможно asciidoc или другой формат в этом плане лучше.
Но мне видится еще проблема таблиц с многострочными текстами в ячейках. Кажется, ни один из форматов такого не поддерживают.