왜 에코합니까? | 문자를 표준 출력으로 반환

왜 에코합니까? | 문자를 표준 출력으로 반환

이 명령의 출력을 이해하려고 노력 중입니다 echo ?. 내가 보는 출력은 하나의 |문자입니다.

답변1

?쉘의 특수 와일드카드 문자이기 때문입니다 . $abc가 존재하지 않으므로 빈 문자열로 확장되고 ?현재 디렉터리에 있는 단일 문자 파일이나 디렉터리로 대체됩니다. 따라서 |현재 디렉터리에 이름이 지정된 파일/디렉토리가 있을 수 있습니다.

내 시스템에서는 출력이 다릅니다.

$ echo $abc?
_ 1

단일 문자 파일/디렉토리가 없으면 파일/디렉토리가 ?확장되지 않습니다.

실제로 디렉토리 _1.

답변2

왜냐하면? ?기본적으로 다음을 의미하는 전역 문자( ) 를 포함하는 단어로 분할됩니다 .

glob 과 일치하는 현재 디렉터리의 파일 이름 목록을 인쇄합니다 ?.

glob은 ?단일 문자가 있는 모든 파일과 일치합니다. 따라서 이것은 작동합니다.

$ touch a \| b
$ echo ?
| a b
$ ls -l ?
-rw-r--r-- 1 user user 0 Dec 29 10:03 '|'
-rw-r--r-- 1 user user 0 Dec 29 10:03  a
-rw-r--r-- 1 user user 0 Dec 29 10:03  b

이는 문자가 포함된 파일/디렉토리가 존재하지 않는 경우 발생합니다.

$ rm a \| b
$ echo ?
?

이는 기본 설정을 사용한 bash의 출력입니다.
파일을 명확하게 보려면 다음을 수행하십시오.

$ ls -l ?
ls: cannot access '?': No such file or directory

활성화 하면 nullglob출력이 인쇄되지 않습니다.

$ shopt -s nullglob
$ echo ?
$

관련 정보