shebang의 어떤 유형의 경로가 더 바람직합니까?


20

스크립트에서 첫 번째 줄은 인터프리터 경로를 지정해야합니다.
그러나 다른 서버의 Linux, Unix 또는 BSD에서는이 경로가 다를 수 있습니다.

더 바람직한 것은 무엇입니까?

#!/usr/bin/env bash 

또는

#!/bin/bash 

답변:


22

표준 위치에 설치된 지정된 운영체제의 시스템 설치 버전을 사용하려면 직접 경로를 사용하십시오. 사용자의 첫 번째 버전에 인터프리터 버전을 $PATH사용하려면을 사용하십시오 #!/usr/bin/env ....

env명령은 지정된 명령을 호출하여 환경 변수를 설정하거나 설정 해제 할 수 있습니다.

env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &

환경 변수 나 다른 옵션을 지정하지 않으면 명명 된 명령 만 호출됩니다. (이 방법을 사용하는 것은 약간의 해킹 일 것입니다.)

shebang을 다음과 같이 쓰는 목적

#!/usr/bin/env interp

interp에서 처음 나타나는 것을 호출하는 것 입니다 $PATH.

즉, 스크립트를 작성할 때 정확히 어디에 있는지 interp(예 /bin: /usr/bin, 또는 에있을 수 있는지) 알 필요가 없습니다 /usr/local/bin. 물론 당신은 알고 있나요 env이다 /usr/bin/env, 그러나 그것은 합리적으로 보편적 인 것 같다.

장점은 어떤 버전의 인터프리터가 사용자의 첫 번째 버전에 나타나는지를 호출한다는 것 $PATH입니다. 단점은 인터프리터의 그것을 원용하는 중 버전은 사용자의에 처음 나타나는 것입니다 $PATH.

예를 들어, 와 perl같이 내 홈 디렉토리에 개인 빌드를 설치했으며 내 앞에 있습니다. shebang이있는 스크립트를 실행하면$HOME/bin/perl$HOME/bin$PATH

#!/usr/bin/env perl

그런 다음 설치된 자체 perl실행 파일로 실행됩니다. 좋지 않을 수도 있습니다. 스크립트의 저자는 아마도 한 달 전에 소스에서 빌드 한 최첨단 Perl로 테스트하지 않았을 것입니다.

대부분의 시스템 ( /usr/bin/perl/bin/bash각각)에서 일관된 위치에 설치 될 가능성이있는 Perl 또는 Bash와 같은 경우 에는 명령의 직접 경로를 사용합니다. 다른 시스템에 다르게 설치 될 수있는 더 모호한 무언가를 위해, /usr/bin/env트릭을 사용 하거나 스크립트가 설치 될 때 shebang 라인을 조정하는 설치 프로그램을 작성합니다. (저는 Perl 스크립트를 위해 그렇게해야했습니다.)

업데이트 : 난에 좀 더 자세히 갔어요 이 답변이 질문에유닉스 및 리눅스 사이트 .


방금 Ruby를 살펴보기 시작했으며, Ruby의 규칙은 이식성을 위해 [code] #! / usr / bin / env ruby ​​[/ code]로 시작하는 것으로 나타났습니다. 일부는 이것이 '-w'와 같은 루비 인터프리터에 명령 행 인수를 제공하는 것을 어렵게하는데, 이는 Perl에게도 문제가 될 수 있다고 지적했다.
bgvaughan

@bgvaughan Perl의 경우, 요즘 은 스크립트 본문에서 대신 사용 #!/usr/bin/perl하고 사용 use strict; use warnings;하는 것이 일반적 #!/usr/bin/perl -w입니다. 그러나 -T세방에 있어야합니다.
Keith Thompson

경로에서 첫 번째를 원한다면 #! perl을 사용하지 않는 이유는 무엇입니까?
어디에서 왔습니까?

@wheredidthatnamecomefrom : 작동하지 않기 때문입니다. #!라인 처리는 사용하지 않습니다 $PATH. 인터프리터의 경로를 지정해야합니다. (적어도 내 시스템에서는 상대 경로가 될 수 있지만 거의 유용하지 않다는 것을 깨달았습니다.)
Keith Thompson

6

가장 좋은 방법은 다음과 같습니다.

#!/usr/bin/env bash 
#!/usr/bin/env sh
#!/usr/bin/env python

등등...

우분투가 처음으로 대시를 사용하기 시작했을 때 일부 스크립트가 손상되었습니다. 그것에 대한 토론이있었습니다. #!/bin/sh/ bin / bash에 대한 링크 인 대부분의 스크립트가 작성 되었습니다. 합의는 이렇습니다 : 스크립트 작성자는 통역사를 지정해야합니다. 따라서 스크립트를 항상 BASH와 함께 호출해야하는 경우 환경에서 스크립트를 지정하십시오. 이것은 유닉스 / 리눅스 시스템마다 다른 경로를 추측 할 필요가 없습니다. 또한 내일 / bin / sh가 / bin / wthsh와 같은 다른 쉘 또는 다른 비음으로 연결되는 링크가되면 작동합니다.


대시 문제에 대한 명백한 대안은 작성하는 것이었다 #!/bin/bash. 나는 스크립트 작가가 인터프리터를 지정하기위한 책임이 있다고 동의하지만 방법은 모든 것을 당신이 비난 쉬하지 bash는 말할 필요하다면
마틴 보너 모니카 지원

1

참고로 Shee-Bang #!이 필요합니다 #. 이 행을 사용하여 스크립트를 실행할 인터프리터를 식별하십시오.

기본적으로 우분투 /bin/sh는 대시로 연결 됩니다

대시에 대해 알고 싶은 정도와 시스템 또는 데몬 셸에 대시가 사용되는 이유에 따라 다음을 참조하십시오.

cyberciti.biz 대시

우분투 대시 매뉴얼 페이지

Bash는 대부분의 Linux 사용자가 사용하는 기본 셸이며 대시와 다른 기능이 있습니다. bash 용으로 작성된 스크립트는 대시로 실행할 경우 제대로 실행되거나 실행되지 않을 수 있습니다. 스크립트가 복잡할수록 스크립트가 실행될 가능성이 줄어 듭니다.

perl, python 등으로 작성된 스크립트는 /bin/sh또는로 전혀 실행되지 않습니다 /bin/bash.

스크립트를 작성할 때 시방에 어떤 인터프리터를 사용해야하는지 식별합니다

무엇을 사용해야할지 선택하는 것은 스크립트 작성자에 의해 이루어지며 하나는 다른 것보다 낫지 않으며 모두 다양한 기능, 장점 및 단점이 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.