
다음 shell
명령을 고려하십시오.
$ls
my_app newlist note
그리고
$echo *
my_app newlist note
그리고
$printf *
my_app
첫 번째 명령 ls
은 파일에 대한 정보를 나열합니다(기본적으로 현재 디렉터리). 두 번째 명령은 echo
인수로 전달되는 문자열을 출력하는 명령입니다. 그러나 입력 echo *
하면 ls
.
그리고 printf *
첫 번째 파일 이름만 출력으로 제공합니다.
왜 이렇게 echo
해석하는 걸까요? *
그리고 왜 printf
더 이상해졌습니까? 첫 번째 것만 출력하는 것입니까?
답변1
왜 다음과 같은 일을 하도록 echo
해석하는가 ?*
ls
대답은 간단합니다. 그렇지 않습니다. echo
당신이 말한 대로 정확하게 수행됩니다. 인수를 반복하고 인수 사이에 공백을 두고 출력합니다.
그렇다면 왜 다음과 같은 동작이 나타나는 걸까요 ls
?
이는 쉘이 를 *
모든 파일과 일치하는 매개변수 목록으로 대체하기 때문입니다( .
(dotglob이 켜져 있지 않은 경우)으로 시작하지 않음). 그러면 echo
그냥 그 일을 합니다. 이 전역 대체는 다음에 대해 발생합니다.모두명령은 명령이 아닌 쉘에 의해 수행됩니다.
그러면 어떨까요 printf
?
printf
인쇄 서식입니다. 첫 번째 인수는 형식입니다. 그렇게 하면 printf "%s " *
과 같습니다 echo
.
첫 번째 파일이 이면 hello%sworld
다음을 얻습니다.hellofile2world hellofile3world
더 자세히 알아보려면
이 시도. 무슨 일이 일어나고 있는지 배우는 데 도움이 될 것입니다. (이 코드를 실제 용도로 사용하라고 제안하는 것은 아닙니다. 학습용으로만 사용하십시오.)
시도 cat /proc/self/cmdline * | less
- 시작 시 명령줄의 모양이 표시됩니다(셸이 해당 작업을 수행한 후).
답변2
표시할 입력이 없고 문자열로 표시할 매개변수로 *(모든) 파일 목록이 있기 때문입니다.
저것과 같이 쉬운
*는 매개변수인 반면 "*" 내용을 에코하므로 파일 목록이