(reproducible-scripts)=

# 재현 가능한 인터프리터 스크립트

```{contributors}
:authors: rapenne-s
:editors: fricklerhandwerk
```

이 튜토리얼에서는 Nix를 사용하여 [셔뱅][shebang] 스크립트라고도 하는 재현 가능한 인터프리터 스크립트를 만들고 실행하는 방법을 배웁니다.

## 요구 사항

- 작동하는 {ref}`Nix 설치 <install-nix>`
- [Bash]에 대한 기본 지식

## 의존성이 간단하지 않은 간단한 스크립트

URL의 XML 콘텐츠를 가져와 JSON으로 변환하고 읽기 쉽게 서식을 지정하는 다음 스크립트를 살펴보십시오.

```bash
#! /bin/bash

curl https://github.com/NixOS/nixpkgs/releases.atom | xml2json | jq .
```

이 스크립트에는 `curl`, `xml2json`, `jq` 프로그램이 필요합니다. 또한 `bash` 인터프리터도 필요합니다. 스크립트를 실행하는 시스템에 이 의존성 중 하나라도 없으면 스크립트는 부분적으로 또는 완전히 실패합니다.

Nix를 사용하면 모든 의존성을 명시적으로 선언할 수 있으며, Nix를 지원하고 Nixpkgs에서 가져온 필요한 패키지를 사용할 수 있는 모든 머신에서 항상 실행되는 스크립트를 만들 수 있습니다.

## 스크립트

[셔뱅][shebang]은 인터프리터 스크립트를 실행하는 데 어떤 프로그램을 사용할지 결정합니다.

[Bash]: https://www.gnu.org/software/bash/
[shebang]: https://en.wikipedia.org/wiki/Shebang_(Unix)

여기서는 셔뱅 줄 `#!/usr/bin/env nix-shell`을 사용합니다.

[`env`]는 대부분의 최신 유닉스 계열 운영 체제에서 파일 시스템 경로 `/usr/bin/env`에 있는 프로그램입니다. 이 프로그램은 명령 이름을 인수로 받아, 환경 변수 `$PATH`에 나열된 디렉터리에서 해당 이름으로 처음 찾은 실행 파일을 실행합니다.

[`env`]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/env.html

여기서는 [`nix-shell`을 셔뱅 인터프리터로][`nix-shell` as a shebang interpreter] 사용합니다. 이 사용 사례와 관련된 매개변수는 다음과 같습니다.

- `-i`는 파일의 나머지 부분을 해석하는 데 사용할 프로그램을 지정합니다
- `--pure`는 스크립트를 실행할 때 대부분의 환경 변수를 제외합니다
- `-p`는 인터프리터 환경에 있어야 하는 패키지를 나열합니다
- `-I`는 패키지의 [검색 경로][the search path]를 명시적으로 설정합니다

옵션에 대한 자세한 내용은 [`nix-shell` 참조 문서](https://nix.dev/manual/nix/stable/command-ref/nix-shell.html#options)에서 확인할 수 있습니다.

[`nix-shell` as a shebang interpreter]: https://nix.dev/manual/nix/stable/command-ref/nix-shell.html#use-as-a--interpreter
[the search path]: https://nix.dev/manual/nix/stable/command-ref/opt-common.html#opt-I

다음 내용으로 `nixpkgs-releases.sh`라는 파일을 만드십시오.

```shell
#!/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`가 있어야 합니다.

  :::{tip}
  필요한 프로그램을 제공하는 패키지를 찾으려면 [search.nixos.org](https://search.nixos.org/packages)를 사용하십시오.
  :::

- `-I`의 매개변수는 Nixpkgs 저장소의 특정 Git 커밋을 가리킵니다.

  이를 통해 스크립트는 어디에서나 항상 정확히 같은 패키지 버전으로 실행됩니다.

스크립트를 실행 가능하게 만드십시오:

 ```console
 chmod +x nixpkgs-releases.sh
 ```

스크립트를 실행하십시오:

```console
./nixpkgs-releases.sh
```

## 다음 단계

- {ref}`reading-nix-language`에서 패키지와 설정을 선언하는 데 사용되는 Nix 언어에 대해 알아보십시오.
- {ref}`declarative-reproducible-envs`에서 선언적 설정 파일로 재현 가능한 셸 환경을 만들어 보십시오.
- [가비지 컬렉션](https://nix.dev/manual/nix/stable/package-management/garbage-collection.html) – Nix를 통해 사용할 수 있게 된 프로그램이 차지하는 저장 공간을 확보합니다
