모든 스크립트에 * .sh 및 * .rb 파일 확장자를 사용해야합니까?


20

$ HOME / bin 디렉토리에 수동으로 실행되는 실행 스크립트가 많이 있습니다. 일부는 bash로 작성되고 일부는 Ruby로 작성됩니다. 그들 모두는 쉘에 사용할 인터프리터 (내 경우에는 bash 또는 Ruby)를 알려주는 맨 위에 shebang 줄이 있습니다.

작성된 스크립트 언어를 나타 내기 위해 이러한 스크립트에 파일 확장자를 추가하는 것이 더 좋은지 궁금합니다. 예를 들어 Ruby의 스크립트에는 * .rb 접미사가 있고 bash 스크립트에는 * .sh 접미사가 있습니다.

현재이 스크립트는 파일 확장자가없는 단순한 이름을 가지고 있습니다.

가장 좋은 방법은 무엇입니까?


1
간단한 스크립트를 사용하여 shebang에서 확장으로 변환하고 다시 쉽게 변환 할 수 있습니다. 따라서 하나를 시도하고 필요한 경우 나중에 수정하십시오.
Aaron J Lang

답변:


9

와일드 카드 명령이 좋아 할 수 ls *.rb또는 cp *.sh당신이 미래에 스크립트를 구성하려는 경우.

제 생각에는 일찍 시작하거나 나중에 후회하십시오.

편집자 vimshebang 또는 파일 확장자를 기반으로 올바른 구문 강조를 적용 할 수도 있습니다 .

이것은 다양한 편집기에서 모델을 사용하여 수행 할 수도 있습니다. 예 : vim :

# vim: ft=sh

2
IMHO, 조직은 구현 세부 사항이 아니라 기능별로 더 잘 수행됩니다.
grawity

4
@grawity : 그럼에도 불구하고 shebang에 대한 grepping보다 간단한 접미사로 구성하고 있습니다 ...
akira

나는 그 사소한 이유에 동의하지만, 대부분의 편집자들은 파일 유형을 결정하기 위해 shebang을 읽을 정도로 똑똑합니다.
Rich Homolka

10

글쎄-인생의 대부분의 것들 : 그것은 당신의 필요에 달려 있습니다.

이 스크립트는 bin 디렉토리에 있으며이 스크립트는 명령 행에서 호출된다고 가정합니다. 사용자 로서 나는 bla.ksh 또는 foo.bash를 입력해야한다면 성가신 것으로 간주합니다. 또한 코더 가 다른 인터프리터로 이동하기로 결정하면 명령 이름도 변경되므로 이러한 도구를 사용하는 다른 스크립트를 수정해야합니다. 사용자코더 가 동일한 사람 이더라도 매우 성가시다 .

그러나 다른 한편으로는 프로젝트 빌드 디렉토리에 .sh 또는 .tcl과 같은 확장명을 사용합니다. 이렇게하면 make 기능을 사용 하여 파일을 대상 디렉토리에 배포 할 수 있지만이 단계에서는 파일 접미사를 제거합니다.


6

bin디렉토리의 실행 파일 과 편집 가능한 "소스"파일 사이에는 약간의 차이가 있습니다.

  • 소스 파일의 경우 접미사를 사용하면 무엇이 무엇인지 알 수 있으며 #!줄 을 스캔하지 못하는 덜 지능적인 도구를 도울 수 있습니다.
  • 모듈의 경우 관련 프로그램 세트에서만 사용되며, 모두 동일한 인터프리터 (또는 인터프리터 없음)를 사용하며 .pm, .sh또는 .so이러한 경우 를 포함하는 것이 일반적 입니다.
  • 실행 프로그램의 이름은 사용자와 다른 스크립트가 호출하는 "프로그래밍 계약"의 일부입니다. 구현시에도 이름 이 변경되지 않는 것이 중요합니다 . 그래서 분명히 파일 이름은해야 하지 접미사가

컴파일 된 프로그램의 경우 "소스"와 "실행 가능"의 차이점은 명백합니다. 하나는 소스 코드를 포함하고 다른 하나는 기계 언어 또는 해석 된 바이트 코드를 포함합니다. 스크립트의 경우 명백한 차이는 없지만이 make명령은 "스크립트의 소스 코드"와 "스크립트의 실행 가능한 버전"사이의 명 목적 분리를 유지합니다. "쉘 스크립트"의 기본 "컴파일러"는 간단합니다. cp.

별도의 $HOME/source디렉토리를 유지하는 것이 좋습니다 .

  • 에 의해 만들어진 것과 같은 심볼릭 링크를 유지하는 단계 ln -s ../source/foo.sh $HOME/bin/foo; 또는
  • install -m 755 foo.sh ../bin/foo;를 사용하여 변경 한 후 테스트 한 후 수동으로 복사하십시오 . 또는
  • 사용 Makefile규칙은에서 소스 파일을 복사하기 전에 구문 검사를 수행하기 $HOME/source$HOME/bin

각주 : 쉘 스크립트 모듈은 다른 쉘 스크립트에 의해서만 가능하고, 수정합니다 사용하여 해당 스크립트의 내부 상황 .또는 source내장 명령. 이는 실행 가능한 스크립트와 다릅니다.이 스크립트는 다른 프로그램과 마찬가지로 별도의 프로세스로 실행되며 상위 프로세스를 수정할 수 없습니다. 대략적인 규칙으로 모듈은 /usr/lib/name_of_program/name_of_module.sh들어가고 명령은 /usr/bin/name_of_command접미사없이 넣습니다.


3

그것은 필요는 없습니다. 커널은 이미 올바른 인터프리터를 사용하여 ( #!라인으로) 알 수 있으며 모든 인기있는 텍스트 편집기도이를 읽으므로 확장 기능을 추가하면 아무 것도 유용하지 않으며 입력 만 증가시킵니다. 실행 프로그램이 확장명을 갖는 유일한 경우는 프로그램이나 사용자 또는 둘 다에게 중요 할 때입니다.


반면에 모듈과 라이브러리는 거의 항상 확장명을 가지고 있습니다 ( .rb루비 모듈, .soELF 공유 라이브러리 등).


문제는 '접미사를 제공하지 않으면 커널이 커널을 실행할 수 있습니까?'에 관한 것이 아니라 '나에게 도움이됩니까?'입니다. 입력 된 문자의 증가는 완료와 관련이 없습니다.
akira
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.