BIN_DIR =“~ / bin /”이있는 스크립트에서 mkdir이 파일이나 디렉토리가없는 이유는 무엇입니까?


답변:


11

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

BIN_DIR=~/bin/

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

BIN_DIR="$HOME/bin/"

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


6
~스크립트에서 사용하는 데 아무런 문제가 없습니다 . 명령 행에서와 동일한 방식으로 작동합니다. 문제는 Zanna의 답변에 설명 된대로 인용 부호 물결 확장 입니다.
terdon

@terdon, 동의합니다. 그러나 나는 무언가 잘못되었다고 말하지는 않았지만 더 적은주의를 기울여야하기 때문에 더 좋은 생각입니다.
pa4080

5
그러나 여기서 명령 행과 스크립트 사이에는 차이가 없습니다. 이것이 스크립트에 있다는 사실은 완전히 관련이 없으므로 명령 줄에서 정확히 동일한 오류가 발생합니다. 문제는 인용문이 아니라 스크립트에 있다는 것입니다.
terdon

그것은 사실이지만 $HOME스크립트에서 사용 하는 것이 좋습니다.
디저트

3
@ pa4080 물결표 확장을 사용하는 것보다 확장하는 것이 더 나은 이유 에 대한 설명을 추가 할 수 있습니까 $HOME? 당신이 한 유일한 설명은 "더 적은주의를 기울여야하기 때문에 더 좋은 생각입니다"라고 말하는 것입니다. 나는 그것이 무엇을 의미하는지 전혀 모른다. 편집에서 설명 할 수 있습니까? 그것 없이는, 당신의 대답을 뒷받침하는 것은 아무것도 없으므로, 반드시 그것에 속합니다. 틸드 확장은 POSIX에 의해 요구되고있다 해주기 동안 꽤 스크립트의 hashbang 라인은 #!/bin/bash내가 휴대 성이 이유없는 생각 때문에.
Eliah Kagan

23

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

물결 확장

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

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

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


이 문장에 따르면 "매개 변수로 큰 따옴표로 매개 변수 확장이 억제되지 않고 작은 따옴표로만 억제됩니다 . " 의 출력은 cd '~'입니다 -bash: cd: ~: No such file or directory.
pa4080

2
@ pa4080 확장은 ~매개 변수 확장의 일부가 아닙니다.
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.