Должны ли сценарии оболочки работать с абсолютными или относительными путями?

Я предполагаю, что вы используете

echo '`date`'

(обратите внимание на прямые одинарные кавычки) и ожидаете увидеть результат date. Оболочка никогда не расширяет строки внутри одинарных кавычек; вместо этого вы должны использовать двойные кавычки:

echo "`date`"

или просто опустить их

echo `date`

Все это эквивалентно

date

, хотя, за исключением расщепления и глоббинга оболочки (как указывает Стефан Шазелас), которое по умолчанию будет сворачивать пробелы.

1
03.11.2016, 16:12
2 ответа

Насколько я знаю, это в основном зависит от ваших потребностей и предпочтений
Вы найдете множество документов, в которых это оставлено на усмотрение пользователя . Вот что я заметил:

  • абсолютные пути более ясны: кто должен будет поддерживать / изменять ваш скрипт (вы или другие), сможет каждый раз знать, какие каталоги задействованы;
  • с абсолютными путями вы уверены, что задействованные каталоги - это каталог с точным путем, который вы пишете в скрипте;
  • относительные пути короче, но вам нужно быть уверенным в поддереве, с которым вы работаете;
  • вы можете добиться краткости, заменив повторяющиеся пути с помощью переменная в начале скрипта (например, /var/log/app/component/module/logfile.log -> $ module_log_dir / logfile.log)

Как заметил триггер, вы можете добавить проверку задействованных каталогов, просто перед командой на выполнение.

0
28.01.2020, 01:08

Не обязательно вызывать cd в сценарии, но это следует делать осторожно. Множественные вызовы cd - это «запах кода». Абсолютные пути обычно предпочтительнее.

CD может выйти из строя. Обязательно правильно обрабатывайте ошибки.

После вызова cd относительные пути становятся недействительными. В частности, если вы пишете сценарий оболочки, который подготавливает некоторые данные, а затем запускает другую команду, никогда не вызывайте cd : пользователь может полагаться на команду, выполняемую в исходном каталоге. Если ваш сценарий использует имена файлов, переданные в командной строке, они обычно относятся к исходному каталогу; вы можете добавить к ним "$ PWD /" , чтобы сделать их абсолютными, но это приведет к плохим сообщениям об ошибках, если что-то пойдет не так.

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

Остерегайтесь относительных путей: они могут начинаться с - , а аргументы команд, начинающиеся с - , интерпретируются как параметры, если вы не принимаете меры предосторожности. Абсолютные пути не имеют этой проблемы.

1
28.01.2020, 01:08

Теги

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