echo ?, * 파일

unix and linux 2016. 12. 11. 01:08


유닉스 시스템에서 *는 모든 글자를 의미하고, ?은 한 단어를 의미한다.


특이하게도 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











참조 

https://en.wikipedia.org/wiki/Glob_(programming)

Posted by '김용환'
,