파일 이름이 참조되어 있어도 "-"라는 파일에 액세스할 수 없는 이유는 무엇입니까? [복사]

파일 이름이 참조되어 있어도 "-"라는 파일에 액세스할 수 없는 이유는 무엇입니까? [복사]

이라는 파일이 있습니다 -. 그 내용을 표시하고 싶습니다.

  • 한 가지 방법은 다음과 같습니다
    cat ./-
    
    cat -표준 입력에서 읽기 때문입니다 .
  • 하지만, 왜 cat "-"그리고 cat '-'또한 쉘에 의해 해석 됩니까 cat -?

답변1

쉘은 cat따옴표를 보기 전에 따옴표를 제거합니다. So cat -및 및 모두는 cat "-"공백 토큰화, 와일드카드 확장 및 따옴표의 쉘 제거 후에 cat '-'배열로 전달됩니다 .['cat', '-']

답변2

따옴표는 셸에서 사용되며 다음 명령으로 전달되지 않습니다.

예를 들어

cat "hello world" #this passes the single token `hello world`, to `cat`, as argument 1. However the quotes are not passed.
cat "-" # this passes the single token `-`, to `cat`, as argument 1. The same as if no quotes had been used.

답변3

GNU cat코딩된파일로 열기 전에 주어진 파일 이름을 "-" 문자열과 비교합니다:

  if (STREQ (infile, "-"))
    {
      have_read_stdin = true;
      input_desc = STDIN_FILENO;
      if (file_open_mode & O_BINARY)
        xset_binary_mode (STDIN_FILENO, O_BINARY);
    }
  else
    {
      input_desc = open (infile, file_open_mode);
      if (input_desc < 0)
        {
          error (0, errno, "%s", quotef (infile));
          ok = false;
          continue;
        }
    }

따라서 이름이 지정된 파일이 있으면 다음과 같이 제공 -해야 합니다 .cat경로와 이름.

따옴표는 공백 구분 및 변수 확장(작은따옴표의 경우)으로부터 값을 보호합니다. 따옴표는 인용된 내용이 파일임을 나타내지 않습니다. 값이 파일임을 명확히 하려면 상대 경로나 절대 경로를 앞에 붙입니다.

그렇다면 GNU가 현재 작업 디렉터리에 파일이 있는지도 cat확인해야 한다고 제안할 수도 있지만 -파일 이름이 하이픈으로 시작하거나 하이픈인 경우는 흔하지 않으므로 이는 성능 문제일 수 있습니다. David Wheeler의 기사,UNIX 및 Linux 파일 이름 수정, 하나 있어요좋은 토론이 질문은 역사적 맥락에서 다루어져야 합니다.

관련 정보