ksh 스크립트 디렉토리를 bash 스크립트로 변환하는 스크립트?

ksh 스크립트 디렉토리를 bash 스크립트로 변환하는 스크립트?

및 둘 다 많은 Korn 쉘 스크립트(ksh) ksh를 기반으로 하기 때문에 shebang 및 파일 확장자가 변경되면 Bourne-again 쉘 스크립트(bash)로 실행됩니다.bashsh

$ 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가 없고 , 정의 배열을 사용할 수 없으며 , 공동 프로세스가 호출되어 다르게 사용됩니다...printset -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. 그러나 문제가 발생하면 스크립트를 수동으로 수정해야 합니다.

관련 정보