명령 입력을 읽으려면 ???를 사용하세요.

명령 입력을 읽으려면 ???를 사용하세요.

입력을 읽을 때 사용되는 이유는 무엇입니까 read? 입력의 ???결과는 무엇입니까 bin src?

$ read
???
$ echo $REPLY
bin src

macOS에서 실행됩니다 bash.

답변1

변수에 저장된 데이터 REPLY는 그대로인데 ???, 변수를 사용한 결과는인용되지 않음with 는 echo당신이 하고 있는 것처럼 하는 것과 같습니다

echo ???

모든 변수 확장에는 큰따옴표가 필요합니다.

변수를 따옴표 없이 확장하면 두 가지 일이 발생합니다.

  1. 변수의 값은나뉘다여러 단어로. 문자가 문자 중 하나 $IFS(기본적으로 공백, 탭 및 줄 바꿈) 와 동일한 경우 분할이 발생합니다. 귀하의 경우 ???값을 수정하지 않으면 분할 결과는 분할 전과 동일합니다(단어 한 단어).$IFS
  2. 생성된 각 단어는파일 이름 생성, 또는 "파일 이름 와일드카드". 즉, 단어가 와일드카드 패턴인 경우, 즉 ???패턴과 일치하는 모든 파일 이름이 패턴을 대체합니다. 이 패턴은 ???3자 길이의 모든 파일 이름과 일치하며 현재 작업 디렉터리에는 분명히 두 개의 파일 이름이 있습니다.

변수 확장이 큰따옴표로 묶여 있으면 이러한 일이 발생하지 않습니다.

예를 들어 문제를 재현하고 해결해 보세요.

$ ls
X11R6   games   lib     libexec mdec    ports   share   xobj
bin     include libdata local   obj     sbin    src
$ read
???
$ echo $REPLY
bin lib obj src
$ echo ???
bin lib obj src
$ echo "$REPLY"
???

위와 동일한 디렉터리의 또 다른 예에서는 입력 문자열이 두 단어( ???s*)로 분할되어 파일 이름 글로빙 패턴으로 사용되는 것을 보여줍니다.

$ read
??? s*
$ echo $REPLY
bin lib obj src sbin share src
$ echo "$REPLY"
??? s*

이는 및 와 src모두 일치하므로 두 번 출력 됩니다 .???s*

관련된:

위의 질문과 답변을 간략하게 요약하면 다음과 같습니다. 언제나큰따옴표모두단, 어떤 확장이 필요하지 않은지 정확히 모르거나 실제로 분할 및 와일드카드를 호출하려는 경우는 제외됩니다.

관련 정보