Я получил папку и файл в моем корневом каталоге с этой структурой: ~/folder/file
.
И папка и файл получили полные полномочия для меня (папка 700, файл 600).The после тестовой команды (это в сценарии оболочки, если это имеет значение), возвраты неожиданно (imo) ложь.
[ -r ~/folder/file ]
echo $? #Prints 1->Failure
Однако, если я использую альтернативный путь к файлу как
pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success
Я пропускаю что-то?
test -r
возвращает true если FILE
существует и читайте, разрешение дано согласно man test
.
Я нашел свою проблему, в конце концов. Вещь, я читал путь из клавиатуры (команда чтения), и так или иначе тильда (~) не расширялась. Решение этого было:
echo 'Give path:'
read var1
var2=$(eval echo "$var1");
Теперь var2 содержит полный путь (расширяющий ~), и я мог использовать свои тесты обычно после этого.
Для добавления ответа Alator нужно отметить, что Расширение Тильды выполняется только в этих случаях:
~
сразу после :
, как в mypath=~/Documents:~/usr/share/stuff
=
, ~
неупомянутый, как в foo=~/bar
~/ascript.sh
stat ~/afile.txt
read
берет литеральную последовательность символов от stdin
и не выполняет Расширение Тильды; что еще более важно, Расширение Тильды выполняется самой оболочкой не ее отдельные встроенные команды.
Один способ иметь дело с этим мог быть через eval
поскольку Alator показал, или можно было использовать замену параметра (который технически является просто ручным способом сделать точно то же самое):
~$ echo "${foo/\~/$HOME}"
/home/username/Documents
С другой стороны, если Вы не возражаете запускать другой процесс (или необходимо иметь дело с теми конкретными языками), можно использовать Python и Perl как так:
python -c 'import sys,os; print os.path.expanduser(sys.argv[1])' "$foo"
perl -e 'print glob qq("$ARGV[0]")' "$foo" "$foo"