Bash가 내장 단어 대신 예약어로 시간을 구현하는 이유는 무엇입니까? [복사]

Bash가 내장 단어 대신 예약어로 시간을 구현하는 이유는 무엇입니까? [복사]

Bash 참조 매뉴얼에 따르면

시간을 예약어로 사용하면 쉘 내장, 쉘 기능 및 파이프의 타이밍을 지정할 수 있습니다. 외부 시간 명령으로는 쉽게 시간을 측정할 수 없습니다.

  1. 그러나 예약어 time와 외부 명령 만 비교하고 time문제를 해결하지 않습니다.

    timeBash가 내장 명령 대신 예약어로 구현되는 이유는 무엇입니까 ?

    이것이 어떤 이점을 가져오나요?

  2. (내장 또는 외부) 명령으로 구현할 수 있는 다른 예약어는 무엇입니까? 그들은 지휘자에 ​​비해 어떤 이점이 있습니까? (그들의 강점이 공통적인지, 아니면 고유한지 파악하려고 노력함)

    예를 들어,

    • 예약어 [[...]]및 내장 명령 test또는[
    • 예약어 select및 내장 명령read

답변1

인용한 텍스트에는 time이것이 키워드인 이유가 이미 설명되어 있습니다.

시간을 예약어로 사용하면 쉘 내장, 쉘 기능 및 파이프의 타이밍을 지정할 수 있습니다. 외부 시간 명령으로는 쉽게 시간을 측정할 수 없습니다.

time단지 내장된 함수라면 파이프라인에서 소요되는 시간을 올바르게 측정하지 못할 것입니다. 예를 들면 다음과 같습니다 .

$ time sleep 2 | sleep 4

real    0m4.002s
user    0m0.000s
sys     0m0.002s

여기서 시간은 전체 파이프라인에 걸린 시간인 4초를 반환합니다. 내장 명령으로 구현된 경우 셸 구문에서는 내장 여부에 관계없이 명령이 특정 경우 인수만 볼 수 있으므로 2초만 반환하도록 허용합니다 sleep 2.

내장 함수로 구현할 수 없는 다른 키워드는 구조화된 구조에 사용되는 키워드입니다. 예를 들어 for, while, until, case, do, done, select, if, then, else, function간단한 time명령 경계에 의해 제한되지 않고 해석될 행을 처리할 수 있어야 합니다.

같은 이유로, 이러한 키워드가 구현하는 명령 및 인수뿐만 아니라 구문 분석할 전체 셸 입력에 액세스할 수 있습니다. 예를 들어, [명령 매개변수는 셸 확장 및 처리에 영향을 받기 때문에 *테스트에서 안정적으로 사용할 수 없으며 >예상치 못한 결과가 있는 리디렉션으로 처리됩니다.

반면에, [[쉘의 간섭 없이 허용되는 모든 구문을 사용할 수 있도록 쉘 동작이 변경되고 있습니다.

다음은 동작의 차이점을 보여주는 몇 가지 예입니다.

$ if [ * = "*" ]; then echo ok; fi
bash: [: too many arguments
$ if [[ * = "*" ]]; then echo ok; fi
ok

$ if [1 > 2]; 그렇지 않으면 echo 예상됨;
사고
$ if [1 -> 2]; 그렇지 않으면 echo 예상됨;
예상되는
$ if [[ 1 > 2 ]]; 그렇지 않으면 echo 예상;
예상되는

if [ 1 > 2 ]예상치 못한 결과가 반환될 뿐만 아니라 2.

답변2

Bash에서 예약어가 되는 중요한 이유 time는 그것이 ksh.

ksh물론, time외부 명령이나 내장 명령 이상의 작업을 허용하고 파이프라인의 타이밍을 맞추는 것과 같습니다.

참고: 사실 이는 timeksh의 예약어입니다. 이는 POSIX 준수 버그일 수 있지만 파서는 ksh다음 단어가 a로 시작하는지 확인합니다 -. 이 경우 외부 명령만 호출합니다 /usr/bin/time. 이를 위해서는 규정 준수 POSIX를 요구해야 한다는 점을 고려하면 전체 법안 은 규정을 준수 합니다 .time -p commandPOSIXkshPOSIX

참고: [[쉘 구문을 만드는 것은 reserved wordin 의 일부입니다. 이렇게 하면 패턴에 쉘 이스케이프(구조와 유사)를 사용할 필요가 없으며 연산자 및 를 I/O 리디렉션으로 인식하는 대신 산술 연산자로 사용할 수 있습니다.ksh[[ ... ]]case><

관련 정보