유닉스 시스템에서 *는 모든 글자를 의미하고, ?은 한 단어를 의미한다.
특이하게도 cat a? 하면 a로 시작하고 2글자의 파일 이름을 가진 모든 파일을 의미하는데,
cat ?는 한 글자로 된 모든 파일 이름을 출력한다는 의미를 가진다.
한 글자 파일이 없을 때 아래와 같은 에러가 발생한다.
$ cat ?
cat: ?: No such file or directory
한 글자 파일을 생성하고 cat ?을 실행해본다. 한 글자 파일을 출력한다.
$ cat > a
1
1
1
$ cat > b
2
2
2
2
$ cat ?
1
1
1
2
2
2
2
파일 명을 보고 싶다면, echo *을 실행한다.
$ echo ?
a b
2글자 이상의 파일명을 보려면 다음과 같이 실행한다.
$ echo ??*
참고로 *를 살펴본다.
echo * 커맨드를 실행하면 현재 디렉토리의 모든 이름을 출력한다. 중요한 것은 알파벳 순서대로 출력된다.
쉘은 *을 분석해 현재 디렉토리의 모든 파일을 검색해서 파일 이름 대체(filename substitution)하는 작업을 진행한다. 따라서 echo의 매개변수 개수는 1개가 아니라 현재 디렉토리의 파일 개수가 된다.
x=*의 값은 현재 디렉토리의 값이 된다.
$ ls
AUTHORS LICENSE.txt-spymemcached buildfile etc pom.xml xdocs
ChangeLog PATENTS devtools install-arcus-memcached.sh src
LICENSE README.md docs mvnTestConf.json
$ x=*
$ echo $x
AUTHORS ChangeLog LICENSE LICENSE.txt-spymemcached PATENTS README.md buildfile devtools docs etc install-arcus-memcached.sh mvnTestConf.json pom.xml src target xdocs
쉘이 커맨드 라인을 파악하는 단계는 다음과 같다.
1. 쉘은 x 값으로 * 를 대체하여 라인을 스캔했다.
2. 쉘은 라인을 다시 살펴보고 * 를 발견 한 후 현재 디렉토리의 모든 파일 이름을 대체했다.
3. 쉘은 echo의 실행을 시작해 파일 목록을 매개변수로 전달했다.
(변수 대체를 먼저 진행하고 파일 대체를 진행한다)
grep에서 *를 사용할 때도 유의할 필요가 있다.
특정 파일에서 '*'만 검색하려고 할 때 $ grep '*' file 을 사용할 수 있지만,
$ grep * file을 사용할 때 *는 현재 디렉토리의 모든 파일을 의미한다.
아래 예시에서 의미를 파악할 수 있다.
$ ls
Main$.class aZ
Main$delayedInit$body.class b
Main.class print_a.sh
Main.scala scalahello
a xx
$ grep * 123131
grep: 123131: No such file or directory
$ grep * xx
$ echo $?
1
참조
'unix and linux' 카테고리의 다른 글
telnet 대신 nc 커맨드 (0) | 2016.12.22 |
---|---|
쉘에서 proxy 설정 모음 (0) | 2016.12.22 |
[주의사항] 서버 실행시 32768 이상 포트를 리스닝(listening) 포트로 설정하지 않기 (0) | 2016.08.26 |
ssh를 이용해 리모트 서버에 파일이 존재하는지 확인하는 bash 스크립트 (0) | 2016.08.25 |
slab memory가 증가하는 현상 처리 - vfs_cache_pressure (0) | 2016.08.24 |