![$HOME이 여기서 HOME 변수를 확장하지 않는 이유는 무엇입니까?](https://linux55.com/image/200711/%24HOME%EC%9D%B4%20%EC%97%AC%EA%B8%B0%EC%84%9C%20HOME%20%EB%B3%80%EC%88%98%EB%A5%BC%20%ED%99%95%EC%9E%A5%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
간단한 스크립트를 작성했습니다.
read -p "Enter the path: " path
echo "$path"
입력을 다음과 같이 지정합니다.
$HOME
출력은 다음과 같습니다
$HOME
내가 쓴다면
echo "$HOME"
산출
/home/sam
그렇다면 전자의 경우에는 어떨까요?
답변1
path
~이 되다끈 $PATH
, "설명"보다는. 이 해석은 특정 상황에서만 발생합니다. 예를 들어 대화형 쉘 명령 프롬프트에 "bare"를 입력했지만 확실히 그렇지 않은 경우 (그렇지 않으면 포함된 텍스트 파일을 읽을 read
수 없습니다 !)read
$
기억하다,확장어디에서나 활성화하고 싶지 않은 기능입니다. 이는 변수를 내용이 아닌 변수로 전달하는 프로그램 작성을 어렵게 만듭니다. 따라서 프로그래밍 언어 설계자(또는 쉘의 경우 수십 년간 유기적 개발)가 확장할 부분과 확장하지 않을 부분을 결정합니다. 여기에는 실제 "이유"가 없습니다. 정의된 방식일 뿐입니다.
당신이 원한다면 eval value="$path"
당신은 그것을 얻을 수 있습니다. 기본적으로 입력을 쉘 프롬프트로 만들어 $(rm -rf /)
사용자가 입력하면 모든 것을 삭제할 수 있기 때문에 이 방법을 권장하지 않습니다 . 예를 들어...
전체적으로 이것은 소프트웨어 설계 질문에 더 가깝다고 생각합니다. 사용자가 어떤 종류의 일을 하기를 원하는가?
이 경우 $HOME
아마도 허용하려는 유일한 "특별한" 상황일 것입니다. ~
표준 형식의 짧은 형식이므로 로 바꾸고 다음을 수행하는 것이 좋습니다 .
read "Enter foo bar baz:" raw_path
if [[ ( ! -d "${raw_path}" ) && "${raw_path:0:1}" = "~" ]]; then
_path="${HOME}${raw_path:1:}"
else
_path="${raw_path}"
fi