쉘 스크립트: `set -u` 및 `$*`

쉘 스크립트: `set -u` 및 `$*`

쉘 스크립트 중 하나를 사용하는 동안 놀라운 동작을 발견했습니다. 다음 코드 조각을 고려해보세요.

set -u
output()
{
    echo "$*"
}
output

나는 bash, ksh93, mksh, zsh, dash 및 pdksh를 사용하여 이 조각을 테스트했습니다. pdksh를 제외한 모든 것이 예상대로 작동합니다.

Pdksh가 불평합니다 *: parameter not set.

글쎄, pdksh가 (어느 정도) 옳습니다. 매개변수 output가 없으므로 $*설정되지 않습니다.

$*로 대체하여 이 문제를 해결했습니다 ${*:-}.

  • pdksh가 정확합니까, 지나치게 까다롭습니까, 아니면 잘못된 것입니까?
  • 솔루션이 ${*:-}작동합니까?

Schilys의 답변에 대한 의견으로 인해 업데이트가 시작되었습니다.

  • 저는 Fedora 31을 사용하고 있으며 패키지 관리자를 통해 설치되지 않은 어딘가에서 pdksh를 찾았습니다.
  • pdksh 버전 @(#)PD KSH v5.2.14 99/07/13.2- 꽤 오래된 버전
  • 내 스크립트의 이식성을 테스트하는 동안 pdksh를 사용했습니다.

답변1

첫째: 현재 인수(arg 벡터)를 $*반영하므로 정의에 따라 존재 상태가 없으므로 해당 변수 에 영향을 주어서는 안 됩니다.$@unsetset -u

이전에는 더 많은 쉘에서 이런 종류의 문제가 발생했으며 ${*:-}해결 방법은 드문 일이 아닙니다.

pdksh버그가 있는 것으로 알려져 더 이상 자체 프로젝트로 적극적으로 유지 관리되지 않으므로 버그가 수정될 것이라고 기대하지 마십시오.

mksh(의 쉘 )은 이식 가능하고 따라서 많은 플랫폼에서 사용할 수 있는 MirBSD고정되고 적극적으로 유지 관리되는 변형입니다 . pdkshThorsten Glaser는 여기서 훌륭한 일을 해냈습니다…

관련 정보