다음 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
?
이는 쉘이 *
모든 파일과 일치하는 인수 목록을 대체하기 때문입니다(a로 시작하지 않음 .
(dotglob이 켜져 있지 않은 경우)). 그럼 echo
그냥 그 일을 하세요. 이 전역 교체는 다음에 발생합니다.모두명령이 아니라 쉘에 의해 수행되기 때문입니다.
그래서 뭐 printf
?
printf
인쇄 형식입니다. 첫 번째 매개변수는 형식입니다. 그렇게 하면 printf "%s " *
그게 다입니다 echo
.
첫 번째 파일이 이면 다음을 hello%sworld
얻게 됩니다.hellofile2world hellofile3world
더 알아보기
이 시도. 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다. (실제 목적으로 이 코드를 사용하도록 제안하는 것은 아닙니다. 학습용으로만 사용하십시오.)
이것을 시도해 보세요 cat /proc/self/cmdline * | less
. 명령줄이 처음에 어떻게 보이는지 보여줍니다(셸이 작업을 마친 후).
답변2
표시할 입력이 없고 대신 *(all) 파일 목록을 인수로 사용하여 문자열로 표시하기 때문입니다.
너무 쉬워요
그리고 *는 매개변수입니다. "*" 내용을 에코하므로 파일 목록은