이것 좀 봐
$ time echo 1
1
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ TESTVAR=TEST time echo 1
1
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 1932maxresident)k
0inputs+0outputs (0major+74minor)pagefaults 0swaps
변수를 미리 내보내서 이 문제를 해결했지만 그 이유를 알고 싶습니다.
(우분투와 배쉬)
답변1
이 형식을 사용하면 ENV=val
bash 내장 명령과 다른 명령을 실행합니다 time
(거기서 GNU 시간 프로그램을 실행합니다 /usr/bin/time
).
내장 쉘을 사용하려면 다음과 같이 사용할 수 있습니다.
$ time TESTVAR=TEST echo 1
1
real 0m0.000s
user 0m0.000s
sys 0m0.004s
$ time TESTVAR=TEST printenv TESTVAR
TEST
real 0m0.003s
user 0m0.004s
sys 0m0.000s
답변2
이는 최근 질문의 이유와 밀접한 관련이 있습니다.POSIX Shell Grammar의 중괄호 명령 그룹에서 여는 중괄호 뒤에 공백이 필요한 이유는 무엇입니까?
time
등은 {
예약어이므로 변수 할당 후에는 나타날 수 없습니다.
bash-5.0$ foo=bar { echo $foo; }
bash: syntax error near unexpected token `}'
bash-5.0$ foo=bar if true; then echo; fi
bash: syntax error near unexpected token `then'
bash-5.0$ foo=bar if true
bash: if: command not found
time
에서는 예약어로 인식되지 않으므로 일반적인 TESTVAR=TEST time echo 1
명령 실행을 수행하고 별칭, 함수 및 (이 경우 궁극적으로) 외부 명령 실행을 찾습니다.