및 둘 다 많은 Korn 쉘 스크립트(ksh) ksh
를 기반으로 하기 때문에 shebang 및 파일 확장자가 변경되면 Bourne-again 쉘 스크립트(bash)로 실행됩니다.bash
sh
$ bash script.bash
대신 전화하세요 $ ksh script.ksh
.
"files"라는 디렉토리에서 ksh를 대체하고 스크립트의 파일 확장자를 변경하는 기본 스크립트가 있습니다.
#!/bin/bash/
#replace instances
find ./files -type f - exec sed -i.bak "s/ksh/bash/g" {} \;
#Change extensions
for f in ./files/*.ksh;
do mv "$f" "./files/""$(basename "$f" .ksh).bash"
done
#Clean up
rm ./files/*.bak
이 스크립트는 작동하고 위의 작업을 수행하지만 ksh 스크립트를 bash로 변환하는 데 충분합니까, 아니면 고려하지 않은 조건이 있습니까?
답변1
스크립트는 실제로 유용한 작업을 수행하지 않습니다. bash를 명시적으로 사용하여 실행하면 확장자는 중요하지 않으며 shebang 줄은 무시됩니다. 다음 명령을 실행하면 스크립트와 정확히 동일한 결과를 얻을 수 있습니다.
bash script.ksh
문제는 구문의 차이입니다. 이것이 당신이 해결해야 할 것입니다그렇지 않은 경우 bash를 사용하여 스크립트를 실행하면 완료됩니다.
답변2
bash
기능의 하위 집합만 구현됩니다 ksh93
. 대부분의 기능을 구현하지만 ksh88
일부 기능은 다르게 구현되며 모든 기능이 기본적으로 활성화되어 있는 것은 아닙니다.
예를 들어, bash
비대화형일 때 별칭은 확장되지 않고, ksh 확장 글로브는 기본적으로 활성화되지 않으며, 내장 함수 bash
가 없고 , 정의 배열을 사용할 수 없으며 , 공동 프로세스가 호출되어 다르게 사용됩니다...print
set -A
따라서 이러한 ksh 스크립트가 매우 간단하고 기본적으로 POSIX sh와 호환되지 않는 한(잘 정의된 명령 하위 집합 bash
및 다양한 ksh
구현 구문) bash
.
이제 2000년부터 ksh93
오픈 소스이며 대부분의 운영 체제에서 무료로 사용할 수 있습니다(대부분 이전 버전과 호환 가능 ksh88
). 일반적 으로 ksh88
스크립트 pdksh
및 최신 스핀오프 mksh
에도 충분합니다 .
그들은 일반적으로 그것보다 훨씬 더 효율적 이므로 원래 작성된 통역사 대신 bash
이러한 스크립트를 해석하기를 원하는 이유를 이해할 수 없습니다 .bash
ksh 에뮬레이션 모드가 있으므로 zsh
더 나은 선택이 될 수도 있습니다.bash
답변3
bash
그리고 ksh
구문의 상당 부분을 공유하므로 두 가지 모두에서 많은 스크립트를 사용할 수 있습니다. 그러나 일부 기능은 지원 ksh
되지 않습니다 bash
(예:일반적인 표현), 이러한 기능을 사용하는 스크립트에는 오류가 발생할 수 있습니다. 스크립트가 단순한지 여부는 중요하지 않습니다. 정규 표현식은 간단한 if
조건에 사용되는 경우가 많습니다.
간단한 스크립트로는 실제로 이러한 문제를 해결할 수 없습니다. 정규식을 다시 작성하는 것은 쉽게 자동화되는 작업이 아닙니다. 너 뭐야할 수 있는자동 실행은 환경의 모든 스크립트를 실행 chroot
하고 bash
구문 오류가 발생하는지 확인하는 것입니다. 그러나 모든 문제가 이 방법으로 감지되었다고 100% 확신할 수는 없으며 일부는 숨겨진 상태로 남아 있을 수 있습니다(구문은 작동할 수 있지만 bash
의미는 in 과 out 에서 다릅니다 ksh
).
답변4
보다 엄격한 접근 방식은 다음을 실행하는 것입니다.checkbashisms
스크립트가 실제로 sh
요구사항을 충족하는지 확인하세요. 둘 다 이러한 스크립트를 매우 잘 실행할 bash
수 있습니다 ksh
. 그러나 문제가 발생하면 스크립트를 수동으로 수정해야 합니다.