왜 다음과 같은 일을 하도록 echo해석하는가 ?*ls

왜 다음과 같은 일을 하도록 echo해석하는가 ?*ls

다음 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

표시할 입력이 없고 문자열로 표시할 매개변수로 *(모든) 파일 목록이 있기 때문입니다.

저것과 같이 쉬운

*는 매개변수인 반면 "*" 내용을 에코하므로 파일 목록이

관련 정보