Пользователю только нужен выполнить бит, существующий на каталоге, содержащем файл, чтобы смочь получить доступ к файлу. Если выполнить бит установлен на каталоге, и у пользователя есть полномочия записи в файл, он может отредактировать тот файл. Без записи перманент на каталоге он привычка смочь создать или удалить файлы (даже если он владеет файлом), но он сможет отредактировать их. Отметьте, хотя это без полномочий чтения (только выполняются, установлено), пользовательская привычка смочь получить список каталогов, он должен будет знать, что точное имя файла файла может получить доступ к ней.
Таким образом, если наш файл в 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
каталог имеет липкий примененный бит).
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
Выберите первый.
Смотрите на эти примеры для получения чувства для того, как использовать подстановочные знаки в bash
. Кроме того, забудьте о eval
материал.
Шарик, который соответствовал бы всем названным каталогам /bin/
это - прямые подкаталоги любого прямого подкаталога .../PortableGit/
:
HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"
Я думаю cd
Ваша проблема. Что точно Вы ожидаете, что это сделает? Если бы существует больше чем один каталог, соответствующий Вашему выражению, это было бы бесплодно для вызова этого тем путем, потому что cd
закончится в первом каталоге соответствия, независимо от того, что Вы - планирование выполнения там. Если Вы хотите последовательно войти, каталоги действительно делают материал в них, то, выполняя цикл по приспосабливанию find
вывод казался бы более соответствующим.
На stackoverflow существует подобный вопрос.
set
. Возможно, необходимо было описать способ обработать его результаты, также. Я все еще думаю, что Лей предназначает что-то какfor GIT_DIR in $*; do cd $GIT_DIR; dostuff; cd ~; done
. Спасибо за Ваш информативный ответ. – J. Katzwinkel 20.02.2013, 22:55$*
(или даже"$*"
), это искажает Ваши аргументы в один (и будет иметь wordsplitting выполненным на них также, если Вы не заключите его в кавычки). Использовать"$@"
вместо этого, который сохраняет неповрежденные аргументы. – Chris Down 21.02.2013, 04:57$*
или$@
, заключенный в кавычки или нет. Мы разговорbash
здесь? – J. Katzwinkel 21.02.2013, 05:08$*
и$@
разделит все аргументы пробелом, итак, если$1
a b
и$2
c
, оба циклично выполнятсяa
,b
, иc
;"$*"
циклично выполнитсяa b c
(как единственная строка), но"$@"
правильно циклично выполнитсяa b
иc
. Если Вы не верите нам, я предлагаю, чтобы Вы открыли терминал и испытали его. – Kevin 21.02.2013, 06:06$1
,$2
, и т.д.), Вам даже не нужноin
часть:for GIT_DIR; do cd $GIT_DIR; do_stuff; done
. – Kevin 21.02.2013, 06:08