Подстановочный знак Bash частичный каталог соответствия

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

Таким образом, если наш файл в dirname/filename.txt и пользователь владеет файлом:

rwx - x - x dirname
Пользователь может отредактировать dirname/filename.txt
Пользователь не может создать dirname/filename2.txt
Пользователь не может удалить dirname/filename.txt
Пользователь не может ls dirname

rwxr-xr-x dirname
Пользователь может отредактировать dirname/filename.txt
Пользователь не может создать dirname/filename2.txt
Пользователь не может удалить dirname/filename.txt
Пользователь может ls dirname

rwxrwxrwx dirname
Пользователь может сделать что-либо

Примечание:
Эти правила не применяются, если каталог имеет липкий примененный бит. Палка укусила, изменяет поведение полностью ( /tmp каталог имеет липкий примененный бит).

3
20.02.2013, 21:37
2 ответа
GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin

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

eval GIT_DIR_PASS=$GIT_DIR

Здесь, это - аргумент простой команде, таким образом, подстановочные знаки расширены, но они были бы расширены до файлов, путь которых "GIT_DIR_PATH=...".

echo $GIT_DIR_PASS

Здесь подстановочные знаки расширены. Вы не печатаете содержание переменной, но список аргументов, которые следуют из расширения, так как переменная не заключается в кавычки.

Вы хотели бы:

set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin

Это, разворачивают тот шаблон в список соответствия файлам и присваивают им $1, $2...

GIT_DIR=$1

Выберите первый.

7
27.01.2020, 21:13
  • 1
    +1. Мне нравится, когда sugguestion использует set. Возможно, необходимо было описать способ обработать его результаты, также. Я все еще думаю, что Лей предназначает что-то как for GIT_DIR in $*; do cd $GIT_DIR; dostuff; cd ~; done. Спасибо за Ваш информативный ответ. –  J. Katzwinkel 20.02.2013, 22:55
  • 2
    @J.Katzwinkel не используют $* (или даже "$*"), это искажает Ваши аргументы в один (и будет иметь wordsplitting выполненным на них также, если Вы не заключите его в кавычки). Использовать "$@" вместо этого, который сохраняет неповрежденные аргументы. –  Chris Down 21.02.2013, 04:57
  • 3
    ! Я привык не к наличию пробела в именах файлов, таким образом, я не думал о разделении слова. Но честно говоря, даже на путях, содержащих пробелы, это действительно не имеет значения, если я использую $* или $@, заключенный в кавычки или нет. Мы разговор bash здесь? –  J. Katzwinkel 21.02.2013, 05:08
  • 4
    @J.Katzwinkel Да, мы говорим удар, и да он имеет значение, как сказал Chris Down. $* и $@ разделит все аргументы пробелом, итак, если $1 a b и $2 c, оба циклично выполнятся a, b, и c; "$*" циклично выполнится a b c (как единственная строка), но "$@" правильно циклично выполнится a b и c. Если Вы не верите нам, я предлагаю, чтобы Вы открыли терминал и испытали его. –  Kevin 21.02.2013, 06:06
  • 5
    Независимо, для движения шага вперед, если Вы - цикличное выполнение по позиционным переменным ($1, $2, и т.д.), Вам даже не нужно in часть: for GIT_DIR; do cd $GIT_DIR; do_stuff; done. –  Kevin 21.02.2013, 06:08

Смотрите на эти примеры для получения чувства для того, как использовать подстановочные знаки в bash. Кроме того, забудьте о eval материал.

Шарик, который соответствовал бы всем названным каталогам /bin/ это - прямые подкаталоги любого прямого подкаталога .../PortableGit/:

HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"

Я думаю cd Ваша проблема. Что точно Вы ожидаете, что это сделает? Если бы существует больше чем один каталог, соответствующий Вашему выражению, это было бы бесплодно для вызова этого тем путем, потому что cd закончится в первом каталоге соответствия, независимо от того, что Вы - планирование выполнения там. Если Вы хотите последовательно войти, каталоги действительно делают материал в них, то, выполняя цикл по приспосабливанию find вывод казался бы более соответствующим.

На stackoverflow существует подобный вопрос.

0
27.01.2020, 21:13
  • 1
    Нет никакой причины избежать кавычек в выражениях шарика. Расширение пути сделано после слова, разделяющего, таким образом, специальные символы "не видят" кавычки вообще. –  Hauke Laging 21.02.2013, 04:26
  • 2
    Спасибо за совместное использование той детали, я изменил свой ответ, чтобы быть менее абсолютного тона. Но: ни один не там причина иметь кавычки, вовлеченные в выражения шарика. Если бы кавычки были вокруг подстановочного знака, то ничто не было бы расширено вообще. Поэтому я отчасти хотел иметь их из пути в этом случае. –  J. Katzwinkel 21.02.2013, 04:58
  • 3
    Вы даже вынуждены использовать кавычки, если выражение шарика содержит метасимволы (как пространство). Сделайте мы знаем, какой $HOMEDIR похож... на положительную сторону –  Hauke Laging 21.02.2013, 05:01
  • 4
    Вы получили меня снова. Я отредактировал соответственно и отступил еще больше. Я надеюсь, что Вы покажете милосердие не доказательства меня неправильно другое время. –  J. Katzwinkel 21.02.2013, 05:21
  • 5
    Ваше решение, сколько Вы хотите изучить сегодня.:-) Если бы Вы решаете узнать больше затем, я указал бы на Вас на то, которое * не соответствует / так, чтобы Ваш "любой подкаталог" был понят как "любой прямой подкаталог". Возможно, Вы подразумевали это, но я нахожу формулировку ambigious. –  Hauke Laging 21.02.2013, 05:40

Теги

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