nixos에서 /bin/bash를 얻는 방법

nixos에서 /bin/bash를 얻는 방법

그래서 나는 she-bang을 다음으로 변경할 수 있다는 것을 알고 #!/usr/bin/env bash있으며 내 스크립트에 대해 그렇게 할 것입니다. 그러나 실제로 #!/bin/bashshe-bang을 사용하여 많은 스크립트를 실행할 수 있기를 원합니다. 때로는 변경하기가 쉽지만 때로는 스크립트가 사용자가 아닌 다른 사람에 의해 직접 실행되기 때문에 그렇지 않은 경우도 있고 실제로 건드리고 싶지 않은 부분이기도 합니다.

링크를 얻기 위해 시스템 구성에서 활성화할 수 있는 옵션이 있습니까 /bin/bash? 이렇게 하면 안 되는 이유가 있습니까? 그리고 이 표준이 아닌 이유는 무엇입니까? (미끄러운 경사면에 대해 말하지 마십시오. /bin/bash이것은 아마도 Unix 시스템에 대한 가장 일반적인 가정 중 하나일 것입니다)

답변1

표준 POSIX 쉘은 이지만 sh가 아닙니다 bash. 따라서 POSIX 시스템에는 Bourne 호환 셸이 사용 가능하고 이름이 지정되어 있다고 가정할 수 있지만 sh해당 셸이 설치되어 있다고 가정할 이유가 없으며 bash해당 쉘이 위치할 것이라고 가정할 이유도 없습니다 /bin/bash. 실제로,POSIX 사양sh다음을 수행할 필요도 없습니다 /bin/sh.

애플리케이션은 셸의 표준 PATH가 /bin/sh 또는 /usr/bin/sh로 가정될 수 없으며 getconf PATH에서 반환된 PATH를 조사하여 이를 결정해야 하며 반환된 경로 이름이 절대 경로 이름이 아닌 절대 경로 이름인지 확인해야 합니다. 내장 쉘.

예를 들어, 표준 sh 유틸리티의 위치를 ​​확인하려면 다음을 수행하십시오.

command -v sh

일부 구현에서는 다음이 반환될 수 있습니다.

/usr/xpg4/bin/sh

또한 실행 가능한 스크립트("#!" 구문)를 지원하는 시스템에서는 실행 가능한 스크립트를 사용하는 응용 프로그램에서 getconf -v를 사용하여 해당 스크립트를 설치하여 쉘 경로 이름을 확인하고 설치 시 "#!"을 적절하게 업데이트하는 것이 좋습니다. 예를 들어 sed 사용).

그래서 비표준이라는 이유는 표준이 아니기 /bin/bash때문입니다 . bash이것이 env존재의 이유이고 #!/usr/bin/env bash존재의 이유이다휴대용 솔루션이런 일을 위해서.

즉, 이것이 귀하의 시스템이라면 전적으로 귀하에게 달려 있습니다. 설치 위치 /bin/bash에 심볼릭 링크를 추가하지 않을 이유가 없습니다 bash. 예를 들어, bash에 있다면 /usr/bin간단히 루트 셸을 열고 다음을 실행할 수 있습니다.

ln -s /usr/bin/bash /bin/bash

시스템을 소유하고 있거나 로컬 시스템 관리자를 통해 시스템을 삭제했다면 문제가 없습니다.

답변2

NixOS의 현재 기본 셸은 Bash입니다. 변경 사항이 없다고 가정하면 에서 다음을 수행할 수 있습니다 /etc/nixos/configuration.nix.

system.activationScripts.binbash = {
    deps = [ "binsh" ];
    text = ''
         ln -s /bin/sh /bin/bash
    '';
  };

관련 정보