테스트 명령: 읽기 가능한 테스트가 실패했습니다.

테스트 명령: 읽기 가능한 테스트가 실패했습니다.

내 홈 디렉토리에 다음 구조의 폴더와 파일이 있습니다 ~/folder/file.

폴더와 파일 모두 나에게 모든 권한을 부여했습니다(폴더는 700, 파일은 600). 다음 테스트 명령(중요한 경우 쉘 스크립트 내부에 있음)은 예기치 않게(imo) false를 반환합니다.

[ -r ~/folder/file ]
echo $? #Prints 1->Failure

그러나 다음과 같은 파일에 대한 대체 경로를 사용하면

pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success

뭔가 빠졌나요?

test -rFILE에 따라 읽기 권한이 부여되고 존재하는 경우 true를 반환합니다 man test.

답변1

결국 내 문제를 발견했습니다. 문제는 키보드(읽기 명령)에서 경로를 읽고 있었는데 어떻게든 물결표(~)가 확장되지 않았다는 것입니다. 이에 대한 해결 방법은 다음과 같습니다.

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

이제 var2에는 전체 경로(~ 확장)가 포함되어 있으며 그 이후에는 정상적으로 테스트를 사용할 수 있습니다.

답변2

보충하다Alator의 답변, 주목해야 할 점은물결표 확장다음과 같은 경우에만 수행됩니다.

  • 변수 할당은 다음 과 같이 ~바로 뒤에 따옴표가 없습니다.:mypath=~/Documents:~/usr/share/stuff
  • 다음과 같이 따옴표 없이 =first 뒤에 변수 할당~foo=~/bar
  • "단어"의 시작:~/ascript.sh
  • 별도의 "단어":stat ~/afile.txt

read문자 그대로의 문자 순서를 취하고 stdin물결표 확장을 수행하지 않습니다. 더 중요한 것은 Tilde 확장이 개별 내장 명령이 아닌 쉘 자체에 의해 수행된다는 것입니다.

이를 처리하는 한 가지 방법은 evalAlator가 보여준 것처럼 또는 매개변수 대체를 사용할 수 있습니다(기술적으로는 정확히 동일한 작업을 수동으로 수행하는 방법입니다).

~$ 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"

관련 정보