BIN_DIR =“~ / bin /”이있는 스크립트에서 mkdir이 파일이나 디렉토리가없는 이유는 무엇입니까? file or directory”와 함께 실패하는

mkdir 명령이 “No such file or directory”와 함께 실패하는 이유는 무엇입니까?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi


답변

~Zanna의 답변에 설명 된대로 물결표 가 인용 되어 오류 메시지가 생성 됩니다. 를 사용 ~하려면 스크립트의 관련 부분이 다음과 같아야합니다.

BIN_DIR=~/bin/

대한 경우 어떤 이유로 당신이 문자열을 인용하려는 경우에는 환경 변수를 사용할 수 있습니다 $HOME:

BIN_DIR="$HOME/bin/"

제 생각에는 두 번째 접근 방식이 더 좋습니다.


답변

~인용되어 있기 때문에 작동하지 않습니다 . 큰 따옴표 "물결표 확장을 억제 합니다 . 리터럴 이름을 가진 디렉토리가 없습니다 ~/bin. man bash(강조 광산)에 설명 된대로 :

물결 확장

단어가 인용되지 않은 물결표 문자 (`~ ‘)로 시작하는 경우 , 첫 번째 인용되지 않은 슬래시 (또는 인용되지 않은 슬래시가없는 경우 모든 문자) 앞에 오는 모든 문자는 물결표 접두어로 간주됩니다. 물결표 접두어의 문자가 인용되지 않으면 물결표 뒤에 물결표 접두어의 문자는 가능한 로그인 이름으로 처리됩니다. 이 로그인 이름이 널 문자열 인 경우 물결표가 쉘 매개 변수 HOME의 값으로 대체됩니다. HOME이 설정되어 있지 않으면 쉘을 실행하는 사용자의 홈 디렉토리가 대신 사용됩니다. 그렇지 않으면 물결표 접두어가 지정된 로그인 이름과 연관된 홈 디렉토리로 바뀝니다.

~경로 ~/bin에서 쉘이 확장을 수행하게하는 유일한 문자 이므로 quotes를 제거 할 수 있으며 , 이 경우 확장을 원합니다. 쉘은 수행하지 않습니다 , 틸드 확장의 결과에 더 확장을 배쉬 4 적어도 우분투의 현재 또는 원격으로 최근 출시되는 . 따라서 홈 디렉토리에 공백과 같은 특이한 문자가 포함되어 있어도 괜찮습니다.

또는 당신이 사용할 수있는 $HOME대신~때문에, 매개 변수 확장은 큰 따옴표로 억제되지 않은 경우에만로, 작은 따옴표 . 큰 따옴표 확장 된 값 자체가 추가 확장에 종속되지 않도록하므로 단어 분할 또는 파일 이름 확장 이 발생하지 않습니다. 그래서 $HOME당신이 따옴표를 유지 너무 오래로, 심지어 너무 이상하게라는 이름의 홈 디렉토리와 함께 작동합니다.