В целом я согласен с предыдущими ответами, но есть еще один важный аспект: удобство использования.
Например, в git
вы можете создать репозиторий с каталогом .git вне его. Чтобы указать это, вы можете использовать аргумент командной строки --git-dir
или переменную окружения GIT_DIR
.
Конечно, если вы измените текущий каталог на другой репозиторий или унаследуете переменные окружения в скриптах, вы получите ошибку. Но если вам нужно набрать несколько git
команд в отдельном репозитории в одной терминальной сессии, это очень удобно: вам не нужно повторять аргумент git-dir
.
Другой пример — GIT_AUTHOR_NAME
. Кажется, что у него даже нет партнера по командной строке (однако у git commit
есть аргумент --author
). GIT_AUTHOR_NAME
переопределяет параметры конфигурации user.name и author.name.
В общем, использование аргументов командной строки или окружения одинаково просто в UNIX: можно использовать аргумент командной строки
$ command --arg=myarg
или переменная окружения в одной строке:
$ ARG=myarg command
Также легко захватить аргументы командной строки в alias
:
alias cfg='git --git-dir=$HOME/.cfg/ --work-tree=$HOME' # for dotfiles
alias grep='grep --color=auto'
Обычно большинство аргументов передаются через командную строку. Я согласен с предыдущими ответами, что это более функционально и прямолинейно, и что переменные окружения в сценариях похожи на глобальные переменные в программах.
GNU libc говорит следующее:
Механизм argv обычно используется для передачи аргументов командной строки, характерных для конкретной вызываемой программы. Окружающая среда, с другой стороны, отслеживает информацию, которая используется многими программами, редко изменяется и реже используется.
Помимо того, что было сказано об опасностях переменных среды, есть хорошие примеры их использования. GNU make имеет очень гибкую обработку переменных окружения (и таким образом очень интегрирован с оболочкой):
Каждая переменная среды, которую make видит при запуске, преобразуется в переменную make с тем же именем и значением. Однако явное назначение в make-файле или с аргументом команды переопределяет среду. (-- и есть возможность изменить это поведение)...
Таким образом, установив переменную CFLAGS в вашей среде, вы можете заставить все компиляции C в большинстве make-файлов использовать предпочитаемые вами параметры компилятора. Это безопасно для переменных со стандартными или обычными значениями, потому что вы знаете, что ни один make-файл не будет использовать их для других целей.
Наконец, подчеркну, что для программы важнее всего не программист, а пользовательский опыт. Возможно, вы включили это в аспект дизайна, но внутренний и внешний дизайн — совершенно разные сущности.
И несколько слов о аспектах программирования. Вы не написали, какой язык вы используете, но давайте представим, что ваши инструменты позволяют вам наилучший анализ аргументов. В Python я использую argparse, который очень гибкий и богатый. Чтобы получить проанализированные аргументы, можно использовать команду вида
args = parser.parse_args()
args можно дополнительно разделить на проанализированные аргументы (скажем, args.my_option), но я также могу передать их в свою функцию целиком. Это решение абсолютно не сложно поддерживать для большого количества аргументов (если ваш язык это позволяет). Действительно, если у вас много параметров и они не используются при разборе аргументов, передавайте их в контейнере до конечного пункта назначения и избегайте дублирования кода (что приводит к негибкости).
И самое последнее замечание: гораздо проще анализировать переменные окружения, чем аргументы командной строки. Переменная окружения — это просто пара VARIABLE=value
. Аргументы командной строки могут быть намного сложнее: они могут быть позиционными или ключевыми аргументами или подкомандами (например, git push
). Они могут захватывать ноль или несколько значений (вспомните команду echo
и флаги вроде -vvv
). Дополнительные примеры см. в разделе argparse.
И еще кое-что. Твое беспокойство по поводу памяти немного тревожит. Не пишите слишком общие программы. Библиотека должна быть гибкой, но хорошая программа полезна и без аргументов. Если вам нужно передать много, это, вероятно, данные, а не аргументы. Как считывать данные в программу — гораздо более общий вопрос, не имеющий единого решения для всех случаев.
person
Yaroslav Nikitenko
schedule
03.02.2021