Как правильно запрограммировать пробный прогон без необходимости повторяться?

Требование не имеет смысла. Программа получает список аргументов командной строки и выбирает, что с ним делать. Сценарий оболочки или любая другая программа принимает столько аргументов командной строки, сколько хочет.

Вы можете определить «принимает аргументы командной строки» как «не делает ничего полезного при вызове с 0 аргументами». Но тогда вам нужно определить «полезный». Приведенный вами пример сценария что-то делает, когда вызывается без аргументов :, он печатает пустую строку. Почему вы определяете печать пустой строки как бесполезную?

Другое возможное определение состоит в том, что программа «принимает аргументы командной строки», если она ведет себя по-другому при передаче хотя бы одного аргумента командной строки, чем при 0. Это наиболее естественное определение для меня, но, очевидно, это не то определение, которое вы, так как ваш пример скрипта использует свой первый аргумент, чтобы определить, что выводить.

Вам нужно переосмыслить свою проблему . Что вы подразумеваете под «принимает аргументы командной строки»? Как только вы определите свою проблему, вы будете ближе к решению.

0
30.08.2019, 02:26
2 ответа

Не знаю zsh, но:

1 )сначала убедитесь, что все ваши «диалоговые» операторы печати идут в stderr, а НЕ в stdout, например:

print -Pn "\n%S%11F%{Initiating Dry-Run%}%s%f" >&2

и многие другие.

2 )Вместо того, чтобы выполнять ваши scpоператоры, printfих в stdout, например:

printf 'scp -qp mcdodyla@falcon1:"%s" "%s"\n' "${NEW_RFILEP[i]}"  "${LOCAL_FILEP[i]}"

Это относится к всем операторам, изменяющим файловую систему, таким как cp, rm, rsync, mkdir, touch, любым другим. После краткого изучения вашего скрипта scpбыл единственным, что бросилось мне в глаза, но вы знаете свой код лучше, чем я.

Снова проверьте свой код и трижды -проверьте, что все fs -, изменяющие («необратимые» )команды, преобразуются в printf. Вы не хотите пропустить ни одного.

Теперь, просто чтобы проверить, правильно ли вы преобразовали свой скрипт, запустите его и выбросьтеstderr:

./myscript 2>/dev/null

Это должно отображать только stdoutиз вашего скрипта.

Вы должны убедиться, что ВСЕ этого вывода являются допустимым синтаксисом оболочки. Все информационные сообщения должны были быть отправлены на stderr, а все операторы «действия» должны быть printfпреобразованы в stdout. Если у вас все еще есть информационные сообщения, просачивающиеся в stdout, вернитесь и снова отредактируйте свой скрипт и убедитесь, что операторы печати перенаправлены >&2.

Как только вы убедительно докажете, что информационные сообщения отправляются на stderr, а фактическая работа идет на stdout, ваше преобразование выполнено.

Для пробного -запуска просто запустите скрипт:

./myscript

Чтобы действительно выполнить работу,снова запустите скрипт и передайте stdoutв оболочку:

./myscript | zsh -v
1
28.01.2020, 02:39

Я недостаточно хорошо разбираюсь в сценариях, чтобы знать, на что способны разные оболочки.

Однако, если конечный результат заключается в том, что вам придется повторять весь этот код снова, вы можете построить свой код в макропроцессоре, таком как m4 -, и использовать процессор m4 для расширения исходного кода до полного сценария.

Например, при написании на языке ассемблера, где нет массивов, но нужно итеративно перебирать адреса, можно было бы написать процедуру один раз с некоторыми макропеременными для фиксированных адресов, а также в файле макроса, определите «массив» и цикл for -, и после того, как это будет обработано m4, у вас будет полный повторяющийся источник.

Может быть, вы могли бы сделать что-то подобное здесь? или, может быть, бесполезная мысль. Просто идея.

0
28.01.2020, 02:39

Теги

Похожие вопросы