다 읽었을 때Google의 셸 스타일 가이드, 나는 약간 혼란스러운 다음 줄을 발견했습니다. "실행 파일에는 확장자가 없어야 합니다(강력히 권장됨). 또는 .sh 확장자가 있어야 합니다. 라이브러리는 .sh 확장자를 가져야 하며 실행 가능해서는 안 됩니다."협회적어도 bash 스크립트의 경우 실행 파일과 bash 스크립트 라이브러리의 차이점은 정확히 무엇입니까? 라이브러리의 스크립트도 실행 가능하지 않습니까?
답변1
적어도 bash 스크립트의 경우 실행 파일과 bash 스크립트 라이브러리의 차이점은 정확히 무엇입니까?
나는 쉘 스크립트에서 "라이브러리"라는 단어가 많이 사용되는 것을 들어본 적이 없으며, 만약 그렇다면 프로그램이 라이브러리로 분리되어야 한다는 사실은 그것이 더 나은 프로그래밍 언어로 가장 잘 구현된다는 것을 의미한다고 제안하고 싶습니다.
즉, 쉘 프로그래밍의 라이브러리는 다른 프로그래밍 언어의 라이브러리와 유사할 것으로 기대합니다. 즉, 다른 프로그램에서 사용할 함수와 서브루틴을 제공하지만 자체는 제공하지 않습니다.하다특히 이러한 도구와 관련된 모든 것. 예를 들어, 라이브러리는 특정 데이터를 압축/압축 해제하기 위한 도구를 제공할 수 있지만 명령줄에 명명된 파일을 압축/압축 해제하기 위한 명령줄 도구를 구현하려면 라이브러리를 사용하는 프로그램이 필요할 수 있습니다.
실제로 셸에 구현된 프로그램은 다른 프로그램처럼 정상적으로 실행되는 반면, 셸 라이브러리에는 함수 정의만 포함되어 있으며 이러한 정의는 다른 셸 스크립트에서 가져옵니다.
main
예를 들어 아래 두 파일에서는 프로그램과 라이브러리 라고 부를 수 있습니다 functions.sh
. 실행 가능 하게 main
만들고 ./main
.$PATH
functions.sh
$PATH
source
bash functions.sh
main
:
#!/bin/bash
source functions.sh
say hello world
functions.sh
:
say() {
printf "%s\n" "$*"
}
실행 가능한 프로그램에 관한 중요 사항아니요확장을 갖는 것은 구현을 노출하지 않는 것과 관련될 수 있습니다. 프로그램 사용자는 그것이 어떻게 구현되는지 알 필요가 없으며 쉘 스크립트를 Perl에서 다시 구현하면 호출하지 않으면 덜 혼란스럽고 foo.sh
이름이 필요하지 않으면 작업량이 줄어 듭니다. 프로그램의 모든 사용자가 변경될 수 있습니다(수정 필요).
그러나 셸 라이브러리는 셸 스크립트에서만 사용할 수 있으므로 구현이 노출됩니다.하다합리적인.
답변2
Bash 관점에서는 라이브러리와 실행 파일 사이에 엄격한 구분이 없습니다.
Google의 스타일 가이드에서 설명하는 부분에서 차이점을 설명합니다.
라이브러리에는 .sh 확장자가 있어야 하며실행 가능하면 안 된다
이러한 파일은 일반적으로 일련의 환경 변수 및 함수 정의입니다. 실행 파일로 실행하면 아무 일도 일어나지 않습니다. 이러한 파일은 다른 스크립트에서만 가져옵니다.
Google 스타일 가이드에서는 다른 프로그래머/유지관리자에게 알리기 위해 ".sh" 접미사를 표시하도록 권장합니다.
답변3
인용하신 Google 가이드는 다소 불분명하지만문서루틴이 포함되어 있습니다. 그들은 하나라고 말해요문서루틴 라이브러리를 포함하도록 작성된 파일에는 실행 비트가 설정되어서는 안 되며 파일 이름은 .sh
.
이러한 종류의 라이브러리 파일에는 호출되는 루틴이 포함되어 있지만 특정 작업을 수행하기 위해 일련의 작업을 수행하는 스크립트는 아닙니다. 따라서 라이브러리 파일의 코드는 실행 가능하지만 파일 자체는 "실행 가능"하지 않습니다.
이는 Google의 스크립팅 지침입니다. 사람들이 정말 좋은 쉘 스크립트를 작성하는 데 도움이 될 수 있는 관행 패턴을 설명하지만 그렇지 않습니다.철통 같은 규칙. IMO가 라이브러리 파일에 대한 실행 권한을 생략하는 것에 대해 말하는 것은 매우 좋은 조언입니다. 파일 이름에 대해 그들이 어떻게 생각하는지는 그다지 중요하지 않습니다(특별히 좋거나 나쁜 조언은 아닙니다).
답변4
나는 이것이 파일 시스템 속성을 참조한다고 생각합니다.
바이너리와 쉘 스크립트에는 "chmod +x" 실행 가능 플래그가 있으며, 라이브러리 스크립트(실수로 직접 호출되는 것을 방지하기 위해)는 실행 가능하지 않습니다.