Bash 참조 매뉴얼에 따르면
시간을 예약어로 사용하면 쉘 내장, 쉘 기능 및 파이프의 타이밍을 지정할 수 있습니다. 외부 시간 명령으로는 쉽게 시간을 측정할 수 없습니다.
그러나 예약어
time
와 외부 명령 만 비교하고time
문제를 해결하지 않습니다.time
Bash가 내장 명령 대신 예약어로 구현되는 이유는 무엇입니까 ?이것이 어떤 이점을 가져오나요?
(내장 또는 외부) 명령으로 구현할 수 있는 다른 예약어는 무엇입니까? 그들은 지휘자에 비해 어떤 이점이 있습니까? (그들의 강점이 공통적인지, 아니면 고유한지 파악하려고 노력함)
예를 들어,
- 예약어
[[...]]
및 내장 명령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
외부 명령이나 내장 명령 이상의 작업을 허용하고 파이프라인의 타이밍을 맞추는 것과 같습니다.
참고: 사실 이는 time
ksh의 예약어입니다. 이는 POSIX 준수 버그일 수 있지만 파서는 ksh
다음 단어가 a로 시작하는지 확인합니다 -
. 이 경우 외부 명령만 호출합니다 /usr/bin/time
. 이를 위해서는 규정 준수 POSIX
를 요구해야 한다는 점을 고려하면 전체 법안 은 규정을 준수 합니다 .time -p command
POSIX
ksh
POSIX
참고: [[
쉘 구문을 만드는 것은 reserved word
in 의 일부입니다. 이렇게 하면 패턴에 쉘 이스케이프(구조와 유사)를 사용할 필요가 없으며 연산자 및 를 I/O 리디렉션으로 인식하는 대신 산술 연산자로 사용할 수 있습니다.ksh
[[ ... ]]
case
>
<