Bash의 특수 문자

Bash의 특수 문자

.bash가 처리하는 방식에서 (또는 ..) 과 ~문자의 차이점은 무엇입니까? char를 사용하면 ~bash는 이를 절대 경로로 확장하지만, (또는..) bash를 사용하면 .절대 경로로 확장하지 않습니까?

내 비밀번호는 홈 디렉토리입니다. 이제 다음 명령을 실행하면 ( ls '.'또는 ls.) pwd의 내용이 표시되지만 명령을 실행하면 ls '~'파일이나 디렉터리가 존재하지 않는다는 오류가 발생합니다. 이는 ~명령에 전달하기 전에 셸에 의해 확장되도록 되어 ls있지만 .그렇지 않습니다. .특수문자 인가요 ? (또는..) .이 쉘에서 특수 문자로 처리되어 확장되는 경우는 언제입니까?

답변1

점은 .쉘의 특수 문자가 아닙니다. .디렉토리 링크의 모든 속성은 ..쉘이 아닌 파일 시스템 구조와 관련되어 있습니다. 거기에서도 문자가 아니라 두 가지 특정 이름이 있다는 점에 유의하세요. foo.txt, .bar...는 점으로 시작하는 파일 이름이 glob 및 ls.

반면에 ~파일 시스템에서는 일반 문자이지만 셸에서는물결표 확장특별 대우를 해주세요. 따라서 ~단어 시작 부분에 따옴표가 없는 단어는 현재 사용자의 홈 디렉토리와 ~foo사용자의 홈 디렉토리로 확장됩니다 foo.

(물론 셸은 .와 가 무엇인지 알고 있습니다 ... 왜냐하면 현재 작업 디렉토리가 로 표시되는 것이 아니라 로 표시되기 때문 cd ..입니다 . 또한 문자 및 와는 달리 점은 변수 이름에 영향을 주지 않습니다(예: and are not). )/tmp/tmp/../_,%-

답변2

~쉘에 의해 독립형(즉, 인용되지 않은) 홈 디렉토리로 해석됩니다. 참조하면 해석이 멈추기 때문에 일반 변수와 다릅니다.

...파일 시스템의 참조입니다 .

따라서 C 프로그램에서 이를 사용하려고 하면 .(셸이 없음) 다음과 같이 작동합니다.

#include <stdio.h>

int main(void) {
  DIR *d;
  struct dirent *dir;
  d = opendir(".");  /*<---------------See the . for current dir */
  if (d) {
    while ((dir = readdir(d)) != NULL) {
      printf("%s\n", dir->d_name);
    }
    closedir(d);
  }
  return(0);
}

~그리고 , ( ) 로 하려고 하면 d = opendir("~");동작하지 않습니다.

관련 정보