заблуждение насчет двойных кавычек

Ах, ха! Проблема в пути, который я экспортирую: ~ / miniconda / bin правильно оценивается в bash , но env не обрабатывает его. Изменение пути, экспортированного с .bash_profile на / Users / aa / miniconda3 / bin / , решает проблему. Теперь обе env python -V и python -V возвращают новую версию.

4
20.02.2016, 01:37
2 ответа

Есть тонкость в том, как работает расширение с подстановочными знаками. Перейдите в каталог, в котором нет файлов .jpg, введите

echo *.jpg

, и он выдаст

*.jpg

. В частности, строка * .jpg остается неизменной. Однако если вы перейдете в каталог, содержащий файлы .jpg, например, предположим, что у нас есть два файла: image1.jpg и image2.jpg, тогда команда echo * .jpg не будет выводить

image1.jpg image2.jpg

, а * .jpg будет расширен .

Если вы наберете

find . -name *.jpg

и при этом в каталоге, в котором вы находитесь, нет файлов .jpg, тогда find получит аргументы «.», «-Name» и «* .jpg». Если, однако, вы наберете эту команду в каталоге, содержащем файлы .jpg, например image1.jpg и image2.jpg, тогда find получит аргументы «.», «-Name», «image1.jpg» и «image2.jpg». ", поэтому фактически запустит команду

find . -name image1.jpg image2.jpg

и find будет жаловаться. Что действительно может сбить с толку, если вы опустите кавычки, так это наличие одного файла .jpg (скажем, image1.jpg). Тогда расширение подстановочного знака приведет к

find . -name image1.jpg

, и команда find найдет все файлы с базовым именем image1.jpg.

В сторону: Это действительно приводит к полезной идиоме bash для проверки, соответствуют ли какие-либо файлы заданному шаблону:

if [ "$(echo *.jpg)" = "*.jpg" ]; then
    # *.jpg has no matches
else
    # *.jpg has matches
fi

хотя имейте в виду, что это не сработает, если в текущем каталоге есть файл с именем '* .jpg'. Для большей герметичности вы можете сделать

if [ "$(echo *.jpg)" = "*.jpg" ] && [ ! -e "*.jpg" ]; then
    # *.jpg has no matches
else
    # *.jpg has matches
fi

(Хотя это не имеет прямого отношения к вопросу, я добавил это, поскольку он иллюстрирует некоторые аспекты того, как работает расширение с подстановочными знаками.)

5
27.01.2020, 20:48

Вам нужно экранировать звездочку в шаблоне имени, потому что find хочет выполнить собственное расширение глобуса во всех различных каталогах, которые он ищет . Если не экранировать, * будет расширен оболочкой, и только для текущего каталога. Это, скорее всего, приведет к незаконному вызову находки .

4
27.01.2020, 20:48

Теги

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