존재하다.sh

존재하다.sh

약 20개의 작은 파일로 구성된 프로젝트가 있습니다 .sh. 일반적으로 어떤 파일에도 20줄 이상의 코드가 없기 때문에 "작은"이라고 명명했습니다. 저는 모듈식 접근 방식을 취했습니다.유닉스 철학그리고 프로젝트를 유지하는 것이 더 쉽습니다.

각 파일의 시작 부분 .sh#!/bin/bash.

간단히 말해서 스크립트 선언은 두 가지 목적으로 사용된다는 것을 이해합니다.

  1. 이는 사용자가 파일을 실행하는 데 필요한 쉘이 무엇인지 기억하는 데 도움이 됩니다(예: 몇 년 동안 파일을 사용하지 않은 후).
  2. 이는 스크립트가 특정 셸(이 경우 Bash)을 통해서만 실행되도록 하여 다른 셸을 사용할 때 예기치 않은 동작을 방지합니다.

프로젝트가 5개 파일에서 20개 파일로 또는 20개 파일에서 50개 파일로 증가하기 시작하면(단순한 데모용 사례가 아님) 20줄 또는 50줄이 됩니다.철사스크립트 선언. 인정합니다. 어떤 사람들에게는 이것이 흥미로울 수도 있지만, 나에게는 20이나 50이라고 말하는 것이 약간 중복된 것처럼 느껴집니다.항목당 1개(아마도마스터 파일프로젝트).

일부 기본 파일에서 일부 "전역" 스크립트 선언을 사용하여 소위 20줄 또는 50줄 이상의 스크립트 선언 라인 중복을 방지할 수 있는 방법이 있습니까?

답변1

비록 현재 프로젝트가 50개의 Bash 스크립트로만 구성되어 있을지라도 조만간 Perl이나 Python과 같은 다른 언어로 작성된 스크립트가 축적되기 시작할 것입니다(이러한 스크립팅 언어에는 Bash에 없는 장점이 있기 때문입니다).

각 스크립트에 올바른 #!-line이 없으면 다음과 같습니다.매우 어렵다어떤 인터프리터를 사용해야 할지 모르고 다양한 스크립트로 작업합니다. 모든 스크립트가 실행되는지는 중요하지 않습니다.다른 스크립트에서, 이는 최종 사용자의 어려움을 개발자에게만 전달합니다. 두 그룹 모두 스크립트를 사용하기 위해 스크립트가 어떤 언어로 작성되었는지 알 필요가 없습니다.

-line 및 명시적 인터프리터 없이 실행되는 쉘 스크립트는 #!호출되는 쉘에 따라 다르게 실행됩니다(예를 들어 질문 참조).Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?특히스티븐의 대답) 이는 프로덕션 환경에서 원하는 것이 아닙니다(일관적인 동작과 이식성을 원함).

명시적 인터프리터를 사용하여 실행된 스크립트는 -line의 내용에 관계없이 #!해당 인터프리터에 의해 실행됩니다 . Python이나 다른 언어로 Bash 스크립트를 다시 구현하기로 결정한 경우 추가 문제가 발생합니다.

추가 키 입력을 소비하고 항상 #!각 스크립트에 한 줄을 추가해야 합니다.


일부 환경에서는 모든 프로젝트의 모든 스크립트에 상용구 법률 텍스트가 여러 개 있습니다. #!프로젝트에서 "중복"으로 느껴지는 라인 일 뿐이라는 점에 만족하세요 .

답변2

당신은 요점을 놓치고 있습니다 #!. 그것은 실제로지시하다운영 체제로 이동하여 정의된 인터프리터에서 프로그램을 실행하십시오.

따라서 스크립트를 작성할 수 있고 #!/usr/bin/perl, 결과 프로그램을 실행할 수 있으며, ./myprogramPerl 인터프리터를 사용할 수 있습니다. 유사하면 #!/usr/bin/python프로그램이 Python에서 실행됩니다.

따라서 이 줄은 #!/bin/bash운영 체제에게 bash에서 이 프로그램을 실행하라고 지시합니다.

예는 다음과 같습니다.

$ echo $0
/bin/ksh

$ cat x
#!/bin/bash

ps -aux | grep $$

$ ./x
sweh      2148  0.0  0.0   9516  1112 pts/5    S+   07:58   0:00 /bin/bash ./x
sweh      2150  0.0  0.0   9048   668 pts/5    S+   07:58   0:00 grep 2148

따라서 내 쉘은 ksh이지만 #!프로세스 목록에서 명확하게 볼 수 있는 이 줄 때문에 "x" 프로그램이 bash에서 실행되고 있습니다.

답변3

존재하다.sh

나쁜 것은 .sh파일 이름 끝에 있습니다.

Python으로 이러한 스크립트 중 하나를 다시 작성한다고 상상해보십시오.

이제 첫 번째 줄을 변경해야 합니다. #!/usr/bin/python3파일의 다른 모든 코드 줄도 변경해야 하기 때문에 그렇게 나쁘지는 않습니다. 그러나 파일 이름 도 prog.sh. 당신이 아는 누군가에게 도움이 될 수 있습니다. 그러나 이제 버전 제어 도구에는 관련 없는 파일에 대한 많은 변경 사항이 표시됩니다.prog.pysed -e 's/.sh/.py/g'

아니면 유닉스 방식으로 프로그램 이름을 prognot 으로 지정하세요 prog.sh.

존재하다#!

올바른 것이 있으면 #!실행을 포함하도록 권한/모드를 설정하세요. 그러면 통역사를 알 필요가 없습니다. 컴퓨터가 당신을 위해 그것을 할 것입니다.

chmod +x prog #on gnu adds execute permission to prog.
./prog #runs the program.

Gnu가 아닌 시스템의 경우 매뉴얼을 읽고 chmod(그리고 8진법을 배우십시오), 어쨌든 읽을 수도 있습니다.

답변4

일부 기본 파일에서 일부 "전역" 스크립트 선언을 사용하여 소위 20줄 또는 50줄 이상의 스크립트 선언 라인 중복을 방지할 수 있는 방법이 있습니까?

예. 이식성 또는 POSIX 규정 준수라고 합니다. 항상 이식 가능하고 쉘에 구애받지 않는 방식으로 스크립트를 작성하도록 노력하십시오. 스크립트 #!/bin/sh가 사용되거나 대화식으로 사용되는 곳 /bin/sh(또는 최소한 POSIX 호환 쉘, 예를 들어 ksh)에서만 스크립트를 가져오십시오.

그러나 이식 가능한 스크립트는 다음을 방지하는 데 도움이 되지 않습니다.

  • 쉘의 기능 중 하나를 사용해야 합니다(일카츄의 답변예시입니다)
  • 쉘(Python 및 Perl)보다 더 높은 수준의 스크립트 언어 사용이 필요합니다.
  • PEBKAC 오류: 귀하의 스크립트는 대신 귀하의 스크립트를 실행한 사용자 J.Doe의 손에 넘어갔습니다.예를 들어 의도적으로 이 작업을 수행 /bin/sh합니다 csh.

내 의견을 표현하자면, 제거를 통해 "중복을 피하는 것" #!은 잘못된 목표입니다. 목표는마디 없는성능과실제로 작동하는 스크립트특정 일반 규칙에 따라 효율적으로 극단적인 경우를 고려하십시오.ls를 구문 분석하지 마세요또는단어 분리가 필요하지 않은 한 항상 변수를 인용하십시오..

이는 사용자가 파일을 실행하는 데 필요한 쉘이 무엇인지 기억하는 데 도움이 됩니다(예: 몇 년 동안 파일을 사용하지 않은 후).

이는 실제로 사용자를 위한 것이 아닙니다. 운영 체제가 올바른 인터프리터를 실행하도록 설계되었습니다. 이 경우 "정확하다"는 것은 운영 체제가 shebang에 있던 것을 발견했음을 의미합니다. 아래 코드가 잘못된 쉘이라면 이는 작성자의 잘못입니다. 사용자 메모리에 관해서는 Microsoft Word나 Google Chrome과 같은 프로그램의 "사용자"가 해당 프로그램이 작성자가 어떤 언어로 작성되었는지 알 필요가 없다고 생각합니다.

그리고 이식 가능한 스크립트는 POSIX 호환 셸에서 작동해야 하기 때문에 원래 사용한 셸을 기억할 필요조차 없을 수도 있습니다.

이는 스크립트가 특정 셸(이 경우 Bash)을 통해서만 실행되도록 하여 다른 셸을 사용할 때 예기치 않은 동작을 방지합니다.

그들은 이것을 하지 않습니다. 예상치 못한 동작을 실제로 방지하는 방법은 이식 가능한 스크립트를 작성하는 것입니다.

관련 정보