예를 들어 다음을 입력할 때:
echo Variable "$var" is not initialised.
그리고
echo "Variable $var is not initialised."
프런트 엔드 결과는 (적어도 내가 아는 한) 정확히 동일합니다. 하지만 echo
의 관점에서 명령이 실행되는 방식에 차이가 있는지 알고 싶습니다 .
echo
모든 매개변수가 한 번에 수신되므로 성능 측면에서 후자가 더 빠릅니까 ?
답변1
존재하다
echo Variable "$var" is not initialised.
echo
5개의 인수를 (계산하는 경우 6개 ) 전달 echo
하면 공백 문자로 구분되어 출력되고 개행 문자로 종료됩니다.argv[0]
echo
존재하다:
echo "Variable $var is not initialised."
1개의 매개변수를 전달합니다(계산하면 2개 echo
).
이 특별한 경우와 대부분의 경우 이는 기능적으로 동일합니다.
두 번째는 셸이 명령을 구문 분석하고 실행하기 전에 인수에 저장하는 작업이 적고 echo
인수를 확인하는 작업이 적다는 것을 의미합니다.echo
이는 성능에 큰 차이를 가져올 가능성이 없습니다. 내 테스트에서 일부 echo
/ 조합( 내장된 shell
것과 같은 ) 에서는 약간의 차이가 있었지만 다른 조합에서는 거의 차이가 없다는 것을 발견했습니다 .bash
여러 매개변수 대신 하나의 매개변수를 전달하려는 다른 이유는 다음과 같습니다.
인수 사이에 여러 개의 공백을 원할 경우
echo a b
출력됩니다 . 출력이a b
필요합니다 .echo 'a b'
a b
echo "$opt" is an invalid option
와 같은 일부echo
구현(예:echo
내장 )의 경우 while과 함께 (또는 또는 ...)을 사용할bash
수 없습니다 .opt=-e
-E
-neE
echo "$opt is an invalid option"
2개의 매개변수( 첫 번째 매개변수
echo foo bar
제외)를 전달할 때 각 매개변수의 길이는 3바이트입니다. 즉, 포인터 2개(64비트 시스템에서는 포인터당 8바이트)와 8바이트( 실제 문자열의 문자열 구분 기호 포함)이므로 총 길이는 다음과 같습니다. 64비트 시스템에서는 24바이트입니다.echo
\0
비록 포인터이고 8바이트
echo 'foo bar'
(총 16바이트)입니다. 이를echo
통해 많은 수의 매개변수가 포함된 외부 실행 파일을 호출할 때 매개변수 크기 제한에 더 빨리 도달할 수 있습니다(단, Linux에도 단일 매개변수의 최대 크기(128KiB)에 대한 제한이 있습니다).
어쨌든 임의의 데이터(예: $var
내용을 모르는 데이터(비록 여기 문맥에서 숫자와 밑줄만 포함되어 있음을 알 수 있음)) 의 경우 printf
대신 다음 을 사용하려고 합니다 echo
.
printf >&2 '%s\n' "Variable $var is not initialised."
또는:
printf >&2 'Variable %s is not initialised.' "$var"
(이것은 사용자에게 오류로 나타나며 스크립트에서 생성된 일반 출력의 일부가 아니기 때문에 여기에서 stderr로 전송됩니다.)
이 경우 형식 외에도 에 전달해야 합니다 printf
.
이 접근 방식의 또 다른 장점은 메시지를 사용자의 언어로 번역하고, Variable %s is not initialised.
지원되는 모든 언어로 해당 형식으로 미리 만들어진 번역을 제공할 수 있다는 것입니다(그리고 이를 검색하려면 gettext
ksh93/bash를 사용하세요).$"..."