인용 된 물결표 ( '~')로 CD를 넣을 수없는 이유는 무엇입니까?


32

첫 번째 스크립트를 작성하여 이것이 기본적인 질문이라고 확신하지만 누군가 내가 왜 할 수 있는지 설명해 줄 수 있습니다.

cd ~
cd bin
cd ~/bin
cd 'bin'

하지만

cd '~'
cd '~/bin'

나는 필요 cd나는 따옴표를 (이것은 윈도우의 필요 때문에, 디렉토리 이름 중 하나에 공백이있는 디렉토리 경로에 Program Files와인 아래). 두 가지 cd명령으로 해결할 수 있지만 ~따옴표를 넣을 수없는 이유는 무엇입니까?

내가 입력하면 cd '~'(또는 cd "~") :

bash: cd: ~: No such file or directory

29
이런 식으로 작동 하지 않으면 어떻게 cd이름이 ~?
Jörg W Mittag

2
참고로 스크립트를 작성하는 경우 절대 경로를 사용하고 함께 피해야 cd합니다. 변수를 사용하여 여러 번 입력하고 싶지 않은 경로 이름을 저장하십시오. 예 :pf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
디저트

8
@ jamesqf : 합리적인 시스템이 왜 파일과 디렉토리의 이름을 지정하고 싶은지 나보다 더 잘 알고 있다고 생각하는 이유는 무엇입니까? 또한 유닉스가 왜 경로 구성 요소 분리기 및 경로 종료 기의 마법 대역 내 신호를 사용했는지 이해하지 못했습니다. 파일 / 디렉토리 이름이 잘못 /되었거나 NUL?
Jörg W Mittag

3
@ JörgWMittagcd ./~
k_g

2
@jamesqf 역사적으로 유닉스 파일 시스템은 파일 이름에서 '/'(경로 구분자) 및 '\ 0'(NUL-문자열 종료 문자)을 제외한 모든 문자를 Jorg 메모로 허용했습니다. 다른 제한은 없습니다. 많은 Unix 파일 시스템 구현이 있었기 때문에 그 중 하나에 제한을 도입하면 호환성이 떨어지고 복잡성이 증가하고 "이상한"것으로 간주되었습니다! 그리고 '~'확장은 csh에서 비교적 최근에 소개되었고 bash에서 더 광범위하게 도입되었습니다. '~'문자가있는 파일 / 디렉토리는 알 수 없습니다 (예 : myfile ~ myfile의 백업으로)
SusanW

답변:


78

@karel이 그의 답변에서 언급했듯이 ~Bash는 특수 문자이며 현재 사용자의 홈 디렉토리로 확장되었습니다. "Tilde Expansion"의 Bash 매뉴얼을 참조 하거나 매뉴얼 페이지 ( man bash) 에서 "Tilde Expansion"헤드 라인을 검색하십시오 .

주변의 모든 종류의 인용은 ~이러한 물결표 확장을 방지합니다.


cd이름에 공백이있는 디렉토리 에 어떻게 사용할 수 있는지에 대한 질문에 대답하기 위해 몇 가지 대안이 있습니다.

  • 따옴표를 생략하고 대신 백 슬래시로 공백을 이스케이프하십시오.

    cd ~/foo/spaces\ are\ cool/bar
  • 경로의 나머지 부분을 인용하지만 물결표와 첫 번째 슬래시 주위를 생략하십시오.

    cd ~/"foo/spaces are cool/bar"

    보시다시피, 따옴표로 묶은 문자열과 따옴표가없는 문자열을 사이에 공백없이 단순히 옆에 쓰면 Bash에서 연결할 수 있습니다.

  • $HOME물결표 대신 환경 변수 를 사용하십시오. 물결표는 여전히 "큰 따옴표"안에 확장됩니다 (단일 따옴표는 아님).

    cd "$HOME/foo/spaces are cool/bar"

3
@rexkogitans ~'/...'는 작동하지 않으며이 답변이 아닙니다. ~/'...'또는 ~/"..."작동합니다.
hvd

tld; dr : 쉘 구문이기 때문에
Sergiy Kolodyazhnyy

@ hvd 감사합니다. 오타 수정. 이것은 가장 완벽한 답변이며 OP가 원하는 것을 해결하는 방법을 설명합니다. ~/'path'갈 길입니다.
rexkogitans

1
@ hvd 호기심이 거의 없지만 왜 ~'/...'작동 하지 않습니까? 슬래시는 특수 문자가 아니므로 따옴표 내부 또는 외부에서 작동해야합니다.
Kodos Johnson

6
@KodosJohnson "Tilde Expansion"에 대한 Bash 맨 페이지 섹션을 살펴보십시오. 관련 단락도 디저트 답변에 인용되어 있습니다. TL; DR : 단어의 첫 문자가 인용되지 않은 물결표 인 경우 물결표 확장이 발생하며, 그 물결표와 다음 인용되지 않은 슬래시 사이의 모든 것이 "물결표 접두사"로 간주됩니다. 이 접두사가 +,-, 숫자 또는 사용자 이름과 같은 유효한 것이 아닌 경우 인용 부호도 허용되지 않으며 확장에 실패하고 리터럴 ~ 문자를 얻습니다.
바이트 사령관

17

~는 쉘에서 로그인 한 사용자의 홈 디렉토리로 해석되는 특수 문자입니다. '~'는 셸에서 두 개의 작은 따옴표 문자 안에 문자열을 포함하면 해당 문자열이 리터럴 텍스트 문자열로 해석되므로 로그인 한 사용자의 홈 디렉토리가 아닌 리터럴 ~ 문자로 해석됩니다.


~별칭은 의미에서 별칭이 아닙니다 bash. 별칭은 문자열이 간단한 명령의 첫 단어로 사용될 때 단어를 대체 할 수 있도록합니다. . 아래 답변에서 설명하는 것처럼 확장입니다.
디저트

15

이것은 Tilde Expansionbash 이라는 기능 입니다. 인용 :man bash

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

확장이 작동하려면 물결표 문자 ~를 따옴표로 묶지 말아야합니다. 그렇지 않으면 문자가 문자 그대로 사용되며 현재 디렉토리에 cd이름 ~이 지정된 디렉토리가 없으면 문자가 실패합니다 . 인용에 대한 설명은 이 집중적 인 답변 을 참조하십시오 bash. 경로의 일부를 인용해야하는 경우 다음을 수행 할 수 있습니다.

  1. 최소한 작은 따옴표로 인용해야하는 문자를 인용하십시오. 예 :

    ~/dir' 'with' 'spaces/

    또는

    ~/'dir with spaces/'
  2. 적어도 큰 따옴표로 인용해야하는 문자를 인용하십시오. 예 :

    ~/dir" "with" "spaces/

    또는

    ~/"dir with spaces/"
  3. 백 슬래시로 인용해야하는 문자 만 인용하십시오. 예 :

    ~/dir\ with\ spaces/

Tilde Expansion에는 다음과 같은 몇 가지 흥미로운 기능이 있습니다.

  • ~+PWD즉 현재 작업 디렉토리 의 값으로 확장
  • ~-OLDPWD즉, 이전 작업 디렉토리 의 값으로 확장
  • ~john 로그인 이름 "john"과 연관된 홈 디렉토리로 확장

또한 백 슬래시로 '과잉 인용'해도됩니다. 예를 들어, $ touch a; cd \a. (나는 이것이 문제가 될 수 있다고 생각 cd \n했지만 적어도 내 버전의 실험에서 bash제대로 작동한다고 제안합니다.)
LSpice

1

echo명령을 사용하여 탐색

bash에서 작동하는 방법을 탐색하는 가장 쉬운 방법은 echo명령을 사용하는 것입니다. ~이것을 사용 하는 경우 :

$ echo ~
/home/rick
$ echo '~'
~
$ echo "~"
~
$ echo `~`
bash: /home/rick: Is a directory

보시다시피 작은 따옴표 또는 큰 따옴표를 사용 ~하면 문자 그대로 문자열로 해석되고 변수로 확장되지 않습니다. 백틱 (`)을 사용하면 명령으로 실행되고 오류 메시지가 생성됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.