재현 가능한 인터프리터 스크립트#
- Author:
Solène Rapenne @rapenne-s
- Editor:
Valentin Gagarin @fricklerhandwerk
이 튜토리얼에서는 Nix를 사용하여 셔뱅 스크립트라고도 하는 재현 가능한 인터프리터 스크립트를 만들고 실행하는 방법을 배웁니다.
요구 사항#
의존성이 간단하지 않은 간단한 스크립트#
URL의 XML 콘텐츠를 가져와 JSON으로 변환하고 읽기 쉽게 서식을 지정하는 다음 스크립트를 살펴보십시오.
#! /bin/bash
curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .
이 스크립트에는 curl, xml2json, jq 프로그램이 필요합니다. 또한 bash 인터프리터도 필요합니다. 스크립트를 실행하는 시스템에 이 의존성 중 하나라도 없으면 스크립트는 부분적으로 또는 완전히 실패합니다.
Nix를 사용하면 모든 의존성을 명시적으로 선언할 수 있으며, Nix를 지원하고 Nixpkgs에서 가져온 필요한 패키지를 사용할 수 있는 모든 머신에서 항상 실행되는 스크립트를 만들 수 있습니다.
스크립트#
셔뱅은 인터프리터 스크립트를 실행하는 데 어떤 프로그램을 사용할지 결정합니다.
여기서는 셔뱅 줄 #!/usr/bin/env nix-shell을 사용합니다.
env는 대부분의 최신 유닉스 계열 운영 체제에서 파일 시스템 경로 /usr/bin/env에 있는 프로그램입니다. 이 프로그램은 명령 이름을 인수로 받아, 환경 변수 $PATH에 나열된 디렉터리에서 해당 이름으로 처음 찾은 실행 파일을 실행합니다.
여기서는 nix-shell을 셔뱅 인터프리터로 사용합니다. 이 사용 사례와 관련된 매개변수는 다음과 같습니다.
-i는 파일의 나머지 부분을 해석하는 데 사용할 프로그램을 지정합니다--pure는 스크립트를 실행할 때 대부분의 환경 변수를 제외합니다-p는 인터프리터 환경에 있어야 하는 패키지를 나열합니다-I는 패키지의 검색 경로를 명시적으로 설정합니다
옵션에 대한 자세한 내용은 nix-shell 참조 문서에서 확인할 수 있습니다.
다음 내용으로 nixpkgs-releases.sh라는 파일을 만드십시오.
#!/usr/bin/env nix-shell
#! nix-shell -i bash --pure
#! nix-shell -p bash cacert curl jq python3Packages.xmljson
#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/2a601aafdc5605a5133a2ca506a34a3a73377247.tar.gz
curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .
첫 번째 줄은 표준 셔뱅입니다. 추가 셔뱅 줄은 Nix 고유의 구문입니다.
-i옵션으로bash를 파일의 나머지 부분에 대한 인터프리터로 지정합니다.이 경우 스크립트가 실행되는 시스템에 이미 있을 수 있는 프로그램을 스크립트가 암묵적으로 사용하지 않도록
--pure옵션을 활성화합니다.-p옵션은 스크립트 실행에 필요한 패키지를 나열합니다.xml2json명령은python3Packages.xmljson패키지가 제공하고,bash,jq,curl은 같은 이름의 패키지가 제공합니다. SSL 인증이 작동하려면cacert가 있어야 합니다.팁
필요한 프로그램을 제공하는 패키지를 찾으려면 search.nixos.org를 사용하십시오.
-I의 매개변수는 Nixpkgs 저장소의 특정 Git 커밋을 가리킵니다.이를 통해 스크립트는 어디에서나 항상 정확히 같은 패키지 버전으로 실행됩니다.
스크립트를 실행 가능하게 만드십시오:
chmod +x nixpkgs-releases.sh
스크립트를 실행하십시오:
./nixpkgs-releases.sh
다음 단계#
Nix 언어 기초에서 패키지와 설정을 선언하는 데 사용되는 Nix 언어에 대해 알아보십시오.
shell.nix를 사용한 선언적 셸 환경에서 선언적 설정 파일로 재현 가능한 셸 환경을 만들어 보십시오.
가비지 컬렉션 – Nix를 통해 사용할 수 있게 된 프로그램이 차지하는 저장 공간을 확보합니다