Действие

Я установил переменную среды в профиле пользователя

export DATADIR=<absolute path set with `readlink -e target`>

Ожидаемые результаты

После повторного поиска файла профиля я проверил, что он связан с целью с помощью

echo ${DATADIR}; ls ${DATADIR}

Которые являются пропуском. Если я сделаю тест на то,

test -d ${DATADIR} && echo yes || echo no

Это также ожидаемый результат (результат «да»)

Неожиданные результаты

Однако, если я даю другое имя каталога, которое вообще не было определено, скажем, с каким-нибудь тарабарским именем, тест

test -d ${HJIWEODSB} && echo yes || echo no

Также дайте мне "да", это неожиданный проход, так как это имя не является ни файлом, ни каталогом.

Ожидаемые результаты снова

На самом деле также

test -d  && echo yes || echo no

Дает да, что заставляет меня думать, что это относится к текущему каталогу так же, как ls

Вопрос

Я просмотрел справочные страницы теста и эту страницу на Спасательный круг. Наверное я что-то упускаю из виду. В общем, мне нужен надежный тест на существование каталога. Поправки и советы приветствуются.


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

-1
Community 11 Июн 2020 в 17:16
1
test -d true, так как -d — это строка ненулевой длины. Это то же самое, что и test -n "-d".
 – 
Kusalananda
28 Окт 2019 в 12:56

1 ответ

На самом деле я нашел ответ благодаря написанию этого поста.

Чтобы получить ожидаемые результаты, включите имена переменных в кавычки:

test -d "${DATADIR}" && echo yes || echo no

Дает да, пока

test -d "${GIBBERISH}" && echo yes || echo no

Дает нет.

(Мета-примечание: я решил не удалять свой вопрос, поскольку некоторым будущим читателям это может быть полезно. Модераторы, пожалуйста, решите, уместно ли это.)

0
Kusalananda 28 Окт 2019 в 12:55
Также обратите внимание на другую ошибку в вашем коде, $ в переменной не должно быть в export $DATADIR=.... Это то, что дает вам пустую переменную DATADIR (вы никогда не присваиваете ей значение). Кроме того, вам действительно нужно export это?
 – 
Kusalananda
28 Окт 2019 в 12:44
Спасибо, это была опечатка в посте, и это было правильно в оригинальном сценарии. Затем я рад взять ссылки для чтения по правильному использованию export: в моем случае я знаю, что эта переменная должна храниться для процессов, запущенных сценарием, в котором она определена.
 – 
XavierStuvw
28 Окт 2019 в 12:50
Вы используете export для создания переменной среды. Вы создаете переменную среды, когда эта переменная должна быть унаследована дочерними процессами. Во всех остальных случаях export не нужен и достаточно оставить переменную как переменную оболочки.
 – 
Kusalananda
28 Окт 2019 в 12:53
Так что в моем случае это оправдано. Спасибо за дополнение
 – 
XavierStuvw
28 Окт 2019 в 12:59