bash에서 홈 문자 (~)를 사용하여 디렉토리가 존재하는지 확인하십시오


16

bash디렉토리가 실패하면 다음을 확인하는 이유는 무엇 입니까?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktop실제로 존재합니다. 그건 그렇고 Mac에 있습니다.


문제는이 유형의 스크립트에 있습니다

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi

1
당신이 cd "~/Desktop"할 때와 마찬가지로 오류가 발생합니다. 따옴표없이 따옴표없이 인용하거나 변수로 저장해야합니다. 예를 들어, a=~/Desktop; cd $a;작동하지만 serverfault.com/questions/417252/…를a="~/Desktop"; cd Desktop; 참조하십시오.
dylnmc

답변:


7

저스틴은 퀀 타의 답변에 대한 첫 번째 논평에서 자신의 질문을 명확히했습니다. 그는 사용하여 텍스트의 줄을 읽고 read(또는 다른 동적 수단에 의한) 및 물결표를 확장하고자합니다.

문제는 "변수 내용에 물결표 확장을 어떻게 수행합니까?"가됩니다.

일반적인 접근 방식은을 사용하는 eval것이지만 >변수에 공백과 출력 리디렉션 ( ) 과 같은 몇 가지주의 사항 이 있습니다. 다음은 저에게 효과적입니다.

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

다음 각 입력으로 시도하십시오.

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

설명

  • ${mypath//>}떼어 내고 >동안 파일을 소지품 수있는 자 eval.
  • eval echo ...실제 틸드 확장을하는 일이다
  • 주위의 큰 따옴표 eval는 공백이있는 파일 이름을 지원하기위한 것입니다.

이에 대한 보충으로 다음과 같은 -e옵션을 추가하여 UX를 향상시킬 수 있습니다 .

read -p "Provide the destination directory: " -e DESTINATION

이제 사용자가 물결표와 적중 탭을 입력하면 확장됩니다. 그러나 사용자가 탭을 눌렀을 때만 확장이 이루어 지므로이 방법은 위의 평가 방법을 대체 하지 않습니다 . 그가 ~ / foo를 입력하고 엔터를 치면 물결표로 남아 있습니다.

또한보십시오:


23

디렉토리 주변의 큰 따옴표를 제거하여 작동하는지 확인하십시오.

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

물결표 확장의 이유는 인용되지 않은 경우에만 작동합니다.

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

값이 동적으로 나오는 경우는 어떻습니까? 즉 ( pastie.org/4471350 ) DESTINATION입니다 ~/Desktop.
저스틴

3
변수 확장은 평가할 때가 아니라 변수가 설정 될 때 수행되므로 공정한 예가 아닙니다.
MadHatter

+1, 이것은 내 문제를 해결하기에 충분합니다.
Flying Fisher

4

Mac뿐만 아니라 bash를 실행하는 플랫폼에서도 작동하지 않습니다.

"~ / Desktop"을 인용하면 bash에게 ~ 폴더 내에서 Desktop을 찾도록 지시합니다. 인용문은 ~의 특별한 목적을 제거합니다.

참조-http: //www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion

큰 따옴표를 제거하면 작동합니다.


1

운영

echo $HOME

를 사용 $HOME하고 사용자가 실제로 스크립트를 사용하고 있는지 확인하십시오. 만약 루트가 ~그것이 /root아닌 것을 사용한다면 /home/$USER.

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~ 대신 $ HOME이어야합니다.

~ 키보드입니다


여기에 다른 대답을 읽으면 이것이 잘못되었음을 알 수 있습니다.
병아리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.