일부 코드 리팩토링을 수행한 후 이것이 중요한지 알 수 없다는 것을 깨달았습니다.
함수 정의는 다른 파일(일종의 라이브러리)에서 나옵니다. 이 함수는 함수 본문 내의 일부 변수를 사용합니다. 이 변수는 함수가 실제로 실행될 때 설정됩니다.라고대본에서는 할 수 있지만 할 수만 있다면시작스크립트이지만 아직 변수가 정의되지 않았습니다.
이렇게 하면 해가 되나요? 내가 아는 한 bash는 실제로 호출될 때까지 함수 정의에 대해 아무 작업도 수행하지 않습니다. 맞습니까? 이 경우 함수에 사용된 설정되지 않은 변수는 함수가 실제로 실행되기 전에 올바른 값을 포함하므로 중요하지 않습니다.라고.
아니면 지금까지 설정되지 않은 변수를 함수 정의에 포함하면 문제가 발생할까요?
답변1
fn(){ printf %s\\n "${v-not set}"; }
v=value; fn; unset v; fn
value
not set
쉘 함수는 쉘 메모리에 저장된 리터럴 문자열입니다. 정의되면 구문 분석되지만 확장은 평가되지 않습니다.(셸 별칭 제외)또는 리디렉션. 이것들은 다음에서만 평가됩니다.부르다시간.
실제로, 이와 관련하여 이 방법을 사용하면 함수가 호출될 때마다 새 임시 파일을 사용하여 자체 입력을 정의하도록 할 수 있습니다.
fn(){ ls -l /dev/fd/0; cat; } <<INFILE
$@
INFILE
fn some args; fn other args
#in dash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4076148]
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4077081]
other args
#bash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-1036060995 (deleted)
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-531856742 (deleted)
other args