Bash는 함수 정의를 인쇄할 수 있습니다:
$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
echo z
}
declare -fx y
그러나 이는 POSIX Bash에서는 실패합니다./bin/sh그리고/빈/대시:
$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y
POSIX 쉘에서 함수 정의를 인쇄할 수 있습니까?
답변1
이 작업은 휴대용으로 수행할 수 없습니다. POSIX 사양은 함수 정의를 덤프하는 방법이나 함수 구현 방법을 지정하지 않습니다.
에서는 bash
함수를 환경으로 내보낼 필요가 없으며 다음을 사용할 수 있습니다.
declare -f funcname
(그 일을 수행하다 zsh
)
이는 모드 bash
에서 실행 하는 경우에도 작동합니다.posix
$ bash --posix -c 'y(){ echo z; }; declare -f y'
y ()
{
echo z
}
존재하다 ksh
:
typeset -f funcname
(에 적용 가능 bash
, zsh
, mksh
, pdksh
)lksh
존재하다 yash
:
typeset -fp funcname
yash
입력하면 작동하지 않습니다.POSIX 올바른 모드:
$ yash -o posixly-correct -c 'y() { ehco z; }; typeset -fp y'
yash: no such command `typeset'
그리고 zsh
:
print -rl -- $functions[funcname]
whence -f funcname
type -f funcname
which funcname
whence -f
, 은(는 ) 이름이 같은 모든 보고서 별칭을 먼저 표시 which
합니다 . 모든 정의 보고를 type -f
사용할 수 있습니다 .-a
zsh
POSIXly에서는 함수 정의를 직접 문서화해야 합니다. 다음과 같이 할 수 있습니다.
myfunction_code='myfunction() { echo Hello World; }'
eval "$myfunction_code"
또는 도우미 기능
defn() {
code=$(cat)
eval "${1}_code=\$code; $1() { $code; }"
}
defn myfunction << 'EOF'
echo Hello World
EOF
printf '%s\n' "$myfunction_code"