Если вы измените текущий каталог в сценарии оболочки?

Я всегда мысленно рассматривал текущий каталог как нечто для пользователей, а не для сценариев, поскольку он зависит от местоположения пользователя и может отличаться при каждом выполнении сценария.

Поэтому, когда я наткнулся на утилиту Java jar -C Вариант меня немного озадачил.


Для тех, кто не знает -C опция используется перед указанием файла / папки для включения в банку. Поскольку путь к файлу / папке реплицируется в банке, -C опция меняет каталоги перед включением файла:

другими словами:

jar -C flower lily.class

сделаю банку с lily.class файл, тогда как:

jar flower/lily.class

сделаю flower папка в банке, которая содержит lily.class


Для скрипта, который я создаю, я хочу использовать подстановочные знаки Борна folder/* но это сделало бы использование -C невозможно, так как это относится только к следующему непосредственному аргументу.

Таким образом, единственный способ использовать шаблоны - это запуск из текущего каталога; но я все еще чувствую себя неловко в отношении изменения и использования текущего каталога в скрипте.

Есть ли недостаток в использовании текущего каталога в скриптах? Возможно, это почему-то осуждается?

1 ответ

Решение

Я не думаю, что по сути что-то не так с изменением текущего каталога из сценария оболочки. Конечно, это не вызовет ничего плохого, если оно будет принято само по себе.

На самом деле, у меня есть стандартный скрипт, который я использую для запуска сервера на базе Java, и самая первая строка:

cd `dirname $0`

Это гарантирует, что остальные команды в сценарии выполняются в каталоге, который содержит сам файл сценария (полезно, когда на одном компьютере размещается несколько экземпляров сервера), независимо от того, откуда фактически был вызван сценарий оболочки. Без изменения текущего каталога в сценарии, он будет работать правильно, только если пользователь не забудет вручную cd в соответствующий каталог перед запуском скрипта.

В этом случае выполнение cd Операция из сценария удаляет ручной шаг из процесса запуска / завершения работы сервера и в результате делает ошибки менее подверженными ошибкам.

Как и в большинстве случаев, для такого рода вещей есть законное применение. И я уверен, что есть и сомнительные. Это действительно зависит от того, что наиболее подходит для вашего конкретного варианта использования. Что-то, что я не могу прокомментировать... Я всегда просто позволяю maven построить мой JAR для меня.

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