
가능한 한 많은 환경에서 일부 스크립트 1을 테스트하기 위해 UNIX(또는 Unix 계열 운영 체제)를 사용하여 여러 VM을 설정했습니다.
- 리눅스
- 솔라리스
- OS X 2
- FreeBSD
하지만 나는 여러 가지 면에서 실제로 다른 운영 체제를 사용하여 테스트하는 것보다 내가 관심을 갖고 있는 각 셸의 다른 버전을 사용하여 테스트하는 것이 더 중요하다고 가정합니다.
나는 내 VM이 끝없는 순열로 늘어나는 것을 원하지 않기 때문에 특정 VM에 각 셸의 여러 버전을 설치하고 싶습니다. 예를 들어, 아래에서 테스트하면 [:bash,:zsh,:fish,:ksh,:csh,:tcsh,:sh,:dash,:ash]
9개의 셸이 있고 각 버전의 평균 3개 버전을 테스트한다고 가정하면 VM이 100개가 넘습니다.
# operating_systems * shells * shell_versions
4 * 9 * 3
단일 머신이나 가상 머신에 특정 셸의 여러 버전을 설치하고 사용할 수 있는 실용적인 방법이 있습니까? 예를 들어 하나의 Linux VM에 Bash 1, Bash 2, Bash 3 및 Bash 4를 모두 설치할 수 있습니까?
나는 그것을 깨닫는다
- 일부 조합은 덜 중요하므로 무시할 수 있습니다.
- 궁극적으로 각 OS의 여러 버전도 테스트하고 싶습니다.
하지만 그것들은 이 질문과는 별개이므로 이것이 가능한지 고려하기 위해 그러한 문제는 제쳐두겠습니다.
그래서:단일 시스템에 특정 셸의 여러 버전을 설치하고 사용하는 실용적인 방법이 있습니까?
1 나는 "스크립트"라는 용어를 느슨하게 사용하고 있습니다. 내가 테스트하고 싶은 첫 번째 것 중 하나는 rc
, 등의 쉘 파일에 의해 소스가 제공되므로 자체 shebang 라인 .zshrc
이 .bash_profile
없는 것입니다. 따라서 하나의 코드가 여러 셸에서 작동하도록 만들고자 하는 욕구가 있습니다. 쉘 전반에 걸쳐 유용할 수 있는 다른 것들은 내가 가장 좋아하는 쉘(Z Shell)이 반드시 모두 있을 필요는 없지만 Bash나 Korn을 사용하게 만들 수도 있지만 다른 컴퓨터에서 사용하고 싶은 함수와 별칭입니다. 또한 내가 좋아하는 쉘을 shebang 라인에 넣을 수 없는 경우에도 여러 컴퓨터의 쉘 스크립트에서 사용하고 싶은 유용한 조각입니다.
2 오해의 소지가 있는 내용을 말하지 않기 위해 포함된 완전히 접선적인 메모입니다. 실제로 OS X VM을 설정하지 않았습니다. 꽤 번거롭기 때문입니다. 하지만 그렇게 되기를 바라며 목록에 포함시켰으므로 아무도 설정하지 않았습니다. "이봐요! 왜 OS X를 포함하지 않나요!?"라고 말할 것입니다.
답변1
소스에서 빌드하고 싶다면 각 버전을 별도의 접두사에 설치한 다음 그에 따라 스크립트의 경로를 조정할 수 있습니다.
bash, fish, ksh, tcsh, zsh 및 dash는 모두 --prefix
구성 인수를 지원하므로 각 버전을 다운로드하고 실행할 수 있습니다 ./configure --prefix=/opt/SHELL-VERSION; make; make install
. 그런 다음 각 버전을 사용하려면 PATH를 /opt/SHELL-VERSION/bin
앞에 있도록 설정하십시오.
csh는 약간 다르며 더 많은 수동 작업이 필요합니다. 정말로 원한다면 FreeBSD 소스 트리에서 소스를 추출하고 Makefile을 편집할 수 있지만 대부분의 사람들은 실제로 tcsh를 사용합니다.
나는 화산재에 대한 정식 출처가 없다고 생각하지만 아마도 비슷한 방식으로 일을 처리할 것입니다.
답변2
Zanchey가 말했듯이 각 쉘 버전을 자체 접두사에 설치할 수 있습니다. PATH에 넣으려면 이름을 바꾸고 /usr/bin/에 복사하면 됩니다. 예를 들어:
$ bash1
bash-1.0$ ./myscript.sh
# Code here.
bash-1.0$ bash2
# And so on...
user@user-MacBook-Pro:~$ zsh1
# and again until you finish...
user@user-MacBook-Pro ~> exit
# Don't just skip into shells, or deal with the exit. Or just spam ^D.
$ exit