쉘 스크립트 중 하나를 사용하는 동안 놀라운 동작을 발견했습니다. 다음 코드 조각을 고려해보세요.
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 벡터)를 $*
반영하므로 정의에 따라 존재 상태가 없으므로 해당 변수 에 영향을 주어서는 안 됩니다.$@
unset
set -u
이전에는 더 많은 쉘에서 이런 종류의 문제가 발생했으며 ${*:-}
해결 방법은 드문 일이 아닙니다.
pdksh
버그가 있는 것으로 알려져 더 이상 자체 프로젝트로 적극적으로 유지 관리되지 않으므로 버그가 수정될 것이라고 기대하지 마십시오.
mksh
(의 쉘 )은 이식 가능하고 따라서 많은 플랫폼에서 사용할 수 있는 MirBSD
고정되고 적극적으로 유지 관리되는 변형입니다 . pdksh
Thorsten Glaser는 여기서 훌륭한 일을 해냈습니다…