이전 버전의 Bash를 에뮬레이트하는 것이 가능합니까(이 단어가 맞습니까?)?
나는 4.3.11을 사용하고 있으며 내 스크립트가 일부 이전 버전과 호환되는지 알고 싶지만 실제로 이전 버전을 설치하고 싶지 않습니다. 변경 로그를 조사하여 내가 사용하던 이전 버전에서 누락된 기능이 무엇인지 알아낼 수 있었지만 조금 지루한 것 같습니다. 나는 일종의 마법 명령줄 옵션이나 스크립트 명령(아마도 희망사항)이 있기를 바라고 있습니다.
답변1
아니요, bash는 이전 버전의 bash를 에뮬레이트할 수 없습니다. 그러나 이전 버전의 bash를 포함하는 테스트 환경을 설정하는 것은 매우 쉽습니다.
각 패키지를 수동으로 설치해야 하는 경우 라이브러리 비호환성을 해결하는 것은 고사하고 개별 소프트웨어의 이전 버전을 설치하는 것도 지루한 작업입니다. 하지만 더 쉬운 해결책이 있습니다. 이전 버전을 설치하는 것입니다.분배하다. 일관된 소프트웨어 세트(개발 패키지 포함)가 포함된 이전 배포판을 설치하는 데 드는 하드 드라이브 공간 비용은 약 1달러이며, 첫 번째 설치에는 1시간이 걸릴 수 있습니다.
이것슈루트패키지를 사용하면 일반 Linux 시스템과 동일한 시스템에서 실행되는 이전(또는 최신!) Linux 배포판을 쉽게 설치할 수 있습니다. schroot 설정을 쉽게 수행할 수 있습니다.chroot) 여기서 시스템 디렉터리는 이전 소프트웨어를 가리키지만 홈 디렉터리는 일반 환경의 디렉터리입니다. 나는 썼다Debian 기반 배포 가이드;이 방법으로 쉽게 Debian slink로 돌아갈 수 있습니다(bash 2.01.01 사용).
다른 Unix 변형, 다른 CPU 아키텍처 또는 매우 오래된 소프트웨어로 테스트하려는 경우 가상 머신에서 다른 운영 체제를 실행할 수 있습니다. 더 많은 오버헤드(RAM, 디스크 공간, CPU 및 유지 관리)가 발생하지만 여전히 실행 가능합니다.
답변2
Docker 컨테이너에서 모든 버전의 bash를 쉽게 테스트할 수 있습니다.
다음과 같이 bash 3.2를 실행하는 Docker 컨테이너를 시작할 수 있습니다.
$ docker run -it bash:3.2
Docker에 폴더를 탑재하면 컴퓨터의 Docker 컨테이너에 있는 스크립트를 쉽게 테스트할 수 있습니다. 다음을 수행하면 /Users/myuser
Docker 컨테이너에서 폴더를 사용할 수 있습니다 ./myuser
$ docker run -v /Users/myuser/:/myuser -it bash:3.2
여기에 나열된 모든 bash 버전을 사용할 수 있습니다.
해당 이미지의 출처는 여기에서 찾을 수 있습니다:
답변3
POSIX 호환 방식으로 스크립트를 작성한 다음 , 또는 다른 쉘 과 dash
같은 완전히 다른 쉘을 사용하여 테스트하십시오. 쉘 언어의 어두운 구석과 회색 영역을 피하십시오. 모든 작업을 "표준" 방식으로 수행하십시오.zsh
pdksh
물론 이것이 귀하의 코드가 이전 버전의 일부 Bash 버그로 인해 어려움을 겪지 않는다는 것을 증명하지는 않지만 자신감을 향상시킵니다. 한편으로 Bash 버그는 Bash 관련 구성(이식 가능한 스크립트가 실행되지 않는 곳)과 어두운 구석과 회색 영역(많은 스크립트가 실행되지 않는 곳)에서 발견될 가능성이 더 높습니다.
즉, 4중 역평가를 수행하는 세계 최초의 쉘 스크립터가 되지 마십시오.
스크립트를 이식 가능하게 만드는 이점 중 하나는 사용자가 이전 Bash 설치에서 스크립트가 작동하지 않는다는 것을 발견했다고 가정하는 것입니다. 글쎄, 스크립트는 Bash에만 국한되지 않기 때문에 아마도 다른 셸에서 작동하도록 할 수 있고 이미 설치되어 있을 것입니다.
코드에 과거 Bash 관련 오류가 발생했는지 알 수 있는 방법은 두 가지뿐입니다. 이러한 방법 중 하나만 신뢰할 수 있습니다(원하지 않는 방법: 이전 버전의 Bash를 꺼내 테스트해 보세요). 또 다른 접근 방식은 Bash 변경 내역을 주의 깊게 연구하고 스크립트 작업에 영향을 줄 수 있는 이전 버전의 버그가 있는지 확인하는 것입니다.
일부 오래된 배포판을 호스팅하고 때때로 회귀 테스트를 수행하기 위해 VM을 유지하겠습니다.