Команда Test: Читаемые тестовые сбои

Я получил папку и файл в моем корневом каталоге с этой структурой: ~/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.

0
задан 23 March 2018 в 20:40

2 ответа

Я нашел свою проблему, в конце концов. Вещь, я читал путь из клавиатуры (команда чтения), и так или иначе тильда (~) не расширялась. Решение этого было:

echo 'Give path:'
read var1
var2=$(eval echo "$var1");

Теперь var2 содержит полный путь (расширяющий ~), и я мог использовать свои тесты обычно после этого.

0
ответ дан 30 October 2019 в 05:02

Для добавления ответа 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"
0
ответ дан 30 October 2019 в 05:02

Другие вопросы по тегам:

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