함수에서 전체 bash 스크립트를 작성하는 이유는 무엇입니까?

직장에서는 bash 스크립트를 자주 작성합니다. 내 상사는 다음 예와 같이 전체 스크립트를 함수로 나눌 것을 제안했습니다.

#!/bin/bash # Configure variables declare_variables() { noun=geese count=three } # Announce something i_am_foo() { echo "I am foo" sleep 0.5 echo "hear me roar!" } # Tell a joke walk_into_bar() { echo "So these ${count} ${noun} walk into a bar..." } # Emulate a pendulum clock for a bit do_baz() { for i in {1..6}; do expr $i % 2 >/dev/null && echo "tick" || echo "tock" sleep 1 done } # Establish run order main() { declare_variables i_am_foo walk_into_bar do_baz } main 

“가독성”외에 다른 이유가 있습니까? , 몇 개의 주석과 줄 간격으로 똑같이 잘 확립 될 수 있다고 생각합니까?

스크립트를 더 효율적으로 실행합니까 (실제로는 그 반대를 예상합니다), 아니면 앞서 언급 한 가독성 가능성을 넘어서 코드를 수정하는 것이 더 쉬울까요? 아니면 정말 스타일적인 선호일까요?

스크립트가 잘 보여주지는 못하지만 실제 스크립트에서 함수의 “실행 순서”는 매우 선형적인 경향이 있습니다.-walk_into_bari_am_foo가 수행 한 작업에 의존하고 do_baz

-실행 순서를 임의로 바꿀 수 있다는 것은 우리가 일반적으로하는 일이 아닙니다. 예를 들어, walk_into_bar 뒤에 갑자기 declare_variables를 붙이고 싶지 않을 것입니다. 이로 인해 문제가 발생합니다.

An 위 스크립트를 작성하는 방법의 예는 다음과 같습니다.

#!/bin/bash # Configure variables noun=geese count=three # Announce something echo "I am foo" sleep 0.5 echo "hear me roar!" # Tell a joke echo "So these ${count} ${noun} walk into a bar..." # Emulate a pendulum clock for a bit for i in {1..6}; do expr $i % 2 >/dev/null && echo "tick" || echo "tock" sleep 1 done 

댓글

  • 내 스크립트에서 상단에 main()를 배치하고 하단에 main "$@"를 추가하여 호출합니다. 레벨 스크립트 로직을 열 때 가장 먼저해야합니다.
  • 나는 가독성이 몇 개의 주석과 약간의 줄 간격으로 똑같이 잘 확립 될 수 있다는 개념에 동의하지 않습니다. ” . ” 아마도 소설을 제외하고는 ‘ ‘ 각 장과 섹션에 대한 목차와 설명 이름이 없습니다. 프로그래밍 언어에서 ‘는 함수가 제공 할 수있는 가독성을 제공합니다. nd 주석은 ‘ 할 수 있습니다 ‘ t.
  • 함수에서 선언 된 변수는 local-이것은 사소하지 않은 스크립트에서 매우 중요한 변수 범위 를 제공합니다.
  • 당신의 상사와 동의하지 않습니다. 스크립트를 함수로 분리해야하는 경우에는 ‘ 애초에 쉘 스크립트를 작성하지 않아야합니다. 대신 프로그램을 작성하십시오.
  • 함수는 스크립트 내에서 또는 둘 이상의 스크립트에서 반복되는 프로세스를위한 것입니다. 또한 균일 한 방법론을 적용 할 수 있습니다. 예를 들어 함수를 사용하여 syslog에 작성합니다. 모든 사람이 동일한 기능을 사용하는 한 syslog 항목은 더 일관됩니다. 예제와 같은 일회용 기능은 스크립트를 불필요하게 복잡하게 만듭니다. 어떤 경우에는 문제 (변수 범위 지정)가 발생합니다.

답변

이것을 사용하기 시작했습니다. Kfir Lavi의 블로그 게시물 “Defensive Bash Programming”을 읽은 후 bash 프로그래밍 스타일. 그는 몇 가지 좋은 이유를 제시하지만 개인적으로 가장 중요한 이유는 다음과 같습니다.

  • 프로 시저가 설명 적입니다. 코드의 특정 부분이 무엇인지 파악하는 것이 훨씬 더 쉽습니다. 코드 벽 대신에 “오, find_log_errors 함수가 해당 로그 파일에서 오류를 읽습니다.”가 표시됩니다.이를 여러 awk / grep / sed 줄을 찾는 것과 비교합니다. use god는 긴 스크립트 중간에 어떤 유형의 정규식이 있는지 알고 있습니다. 주석이 없으면 “무엇을하는지 알 수 없습니다.

  • 함수를 디버그 할 수 있습니다. set -xset +x로 묶습니다. 나머지 코드가 제대로 작동한다는 것을 알게되면이 트릭을 사용하여 특정 함수 만 디버깅하는 데 집중할 수 있습니다. 물론, 스크립트의 일부를 묶을 수는 있지만 “긴 부분일까요?”다음과 같이하는 것이 더 쉽습니다.

     set -x parse_process_list set +x 
  • cat <<- EOF . . . EOF를 사용한 인쇄 사용법. 코드를 훨씬 더 전문적으로 만들기 위해 여러 번 사용했습니다. 또한 getopts 기능이있는 parse_args()는 매우 편리합니다. 다시 말하지만 이것은 모든 것을 거대한 텍스트 벽으로 스크립트에 밀어 넣는 대신 가독성에 도움이됩니다. 또한 이것을 재사용하는 것도 편리합니다.

그리고 분명히 이것은 훨씬 더 많은 것입니다. C, Java 또는 Vala를 알고 있지만 bash 경험이 제한된 사람이 읽을 수 있습니다. 효율성에 관한 한, 할 수있는 일이 많지 않습니다. bash 자체는 가장 효율적인 언어가 아니며 사람들은 속도와 효율성면에서 perl과 python을 선호합니다.그러나 다음과 같이 함수를 nice 할 수 있습니다.

nice -10 resource_hungry_function 

코드의 모든 줄에서 nice를 호출하는 것과 비교하여, 이렇게하면 타이핑이 많이 줄어들고 스크립트의 일부만 낮은 우선 순위로 실행하기를 원할 때 편리하게 사용할 수 있습니다.

백그라운드에서 함수를 실행하면 전체를 원할 때도 도움이됩니다. 백그라운드에서 실행할 문 묶음입니다.

이 스타일을 사용한 몇 가지 예 :

댓글

  • 그 기사의 제안을 진지하게 받아 들여야할지 모르겠습니다. 물론 몇 가지 좋은 아이디어가 있지만 스크립팅에 익숙한 사람은 아닙니다. single 변수는 따옴표 (!)로 묶여 있으며 UPPER C 사용을 제안합니다. ASE 변수 이름은 기존 환경 변수와 충돌 할 수 있으므로 매우 나쁜 생각입니다. 이 답변의 귀하의 요점은 의미가 있지만 링크 된 기사는 다른 언어에 익숙하고 bash에 스타일을 강요하려는 사람이 작성한 것으로 보입니다.
  • @terdon 나는 기사로 돌아가 다시 읽었습니다. 작성자가 대문자 변수 이름 지정을 언급하는 유일한 위치는 ” 불변 글로벌 변수 “입니다. 전역 변수를 function ‘의 환경 내에 있어야하는 것으로 간주하면 대문자로 만드는 것이 합리적입니다. 참고로 bash ‘ 설명서는 변수 대소 문자에 대한 상태 규칙을 ‘하지 않습니다. 여기 에서도 허용 된 답변은 ” 일반적으로 ” 유일한 ” standard “는 Google에서 제공하며, ‘ 전체 IT 산업을 대표하지 않습니다.

li>

  • @terdon, 나는 변수 인용이 기사에서 언급되어야한다는 것에 100 % 동의하며 블로그의 댓글에서도 지적되었습니다. 또한 다른 언어에 익숙한 지 여부에 관계없이 ‘이 코딩 스타일을 사용하는 사람을 판단하지 않습니다. ‘ 이 전체 질문과 답변은 ‘ 장점과 사용자 ‘의 정도를 명확하게 보여줍니다. ‘ 다른 언어에 익숙해지는 것은 여기서는 관련이 없습니다.
  • @terdon 글은 ” 소스

    자료. 나는 모든 것을 내 의견으로 게시 할 수 있었지만, 기사에서 배운 내용 중 일부는 시간이 지남에 따라 연구를 통해 얻은 것이라는 점을 인정해야했습니다. 저자 ‘의 링크드 인 페이지는 일반적으로 Linux 및 IT에 대한 좋은 경험을 가지고 있음을 보여 주므로 ‘이 기사는 그렇지 않다고 생각합니다. ‘ 실제로는 표시하지 않지만 Linux 및 셸 스크립팅에 관한 귀하의 경험을 신뢰하므로 귀하가 옳을 수 있습니다.

  • 그 ‘는 훌륭한 답변이지만 ‘ 또한 Bash에서 변수 범위를 추가하고 싶습니다. 따라서 local를 사용하여 함수 내에서 변수를 선언하고 main() 함수를 통해 모든 것을 호출하는 것을 선호합니다. 이렇게하면 작업을 훨씬 더 쉽게 관리 할 수 있고 잠재적으로 지저분한 상황을 피할 수 있습니다.
  • 답변

    가독성 은 한 가지입니다. 그러나 모듈화 에는 이것보다 더 많은 것이 있습니다. ( 반 모듈화 가 함수에 더 적합 할 수 있습니다.)

    함수에서 일부 변수를 로컬로 유지하여 신뢰성 을 증가시켜 기회를 줄일 수 있습니다. 엉망진창입니다.

    기능의 또 다른 장점은 재사용 성 입니다. 함수가 코딩되면 스크립트에서 여러 번 적용 할 수 있습니다. 다른 스크립트로 이식 할 수도 있습니다.

    이제 코드가 선형 일 수 있지만 앞으로는 멀티 스레딩 또는 멀티 스레딩 영역으로 들어갈 수 있습니다. Bash 세계에서 처리합니다. 함수에서 일하는 법을 배우면 병행 단계에 들어갈 준비가 된 것입니다.

    추가해야 할 점이 하나 더 있습니다. Etsitpab Nioliv가 아래 주석에서 알 수 있듯이 “일관된 엔티티로서 함수에서 쉽게 리디렉션 할 수 있습니다. 그러나 함수를 사용한 리디렉션의 한 가지 측면이 더 있습니다.” 즉, 함수 정의에 따라 리디렉션을 설정할 수 있습니다. 예 :

    f () { echo something; } > log 

    이제 함수 호출에 명시적인 리디렉션이 필요하지 않습니다.

    $ f 

    이것은 많은 반복을 절약 할 수 있으며 다시 신뢰성을 높이고 일을 정리하는 데 도움이됩니다.

    참조

    댓글

    • 매우 좋음 함수로 분리하면 훨씬 나을 것입니다.
    • 해당 함수를 추가하면 해당 스크립트를 다른 스크립트로 가져올 수 있습니다 (source 또는 . scriptname.sh, 새 스크립트에있는 것처럼 해당 함수를 사용합니다.
    • 이미 다룬 ‘ 또 다른 답변입니다.
    • 감사합니다.하지만 ‘ 차라리 다른 사람들도 중요하게하고 싶습니다.
    • 사례에 직면했습니다. 오늘은 스크립트 출력의 일부를 에코 대신 파일 (이메일을 통해 전송)로 리디렉션해야했습니다. 간단히 myFunction > > myFile을 사용하여 원하는 함수의 출력을 리디렉션합니다. 매우 편리합니다. 관련성이있을 수 있습니다.

    답변

    제 의견에서 함수의 세 가지 장점을 언급했습니다.

    1. 정확성을 테스트하고 확인하기가 더 쉽습니다.

    2. 향후 스크립트에서 함수를 쉽게 재사용 (소스) 할 수 있습니다.

    3. 상사가 좋아합니다.

    그리고 3 번의 중요성을 결코 과소 평가하지 마십시오.

    한 가지 문제를 더 해결하고 싶습니다.

    p>

    … 따라서 실행 순서를 임의로 바꿀 수있는 것은 우리가 일반적으로하는 일이 아닙니다. 예를 들어, walk_into_bar 뒤에 갑자기 declare_variables를 넣으면 문제가 발생하지 않습니다.

    코드를 함수로 분할하는 이점을 얻으려면 함수를 가능한 독립적으로 만들어야합니다. walk_into_bar에 다음과 같은 변수가 필요한 경우 다른 곳에서 사용되지 않는 경우 해당 변수를 walk_into_bar에서 정의하고 로컬로 설정해야합니다. 코드를 함수로 분리하고 상호 종속성을 최소화하는 프로세스는 코드를 더 명확하고 간단하게 만들 수 있습니다. .

    이상적으로, 함수는 개별적으로 쉽게 테스트 할 수 있어야합니다. 상호 작용으로 인해 테스트하기가 쉽지 않다면 리팩토링을 통해 이점을 얻을 수 있다는 신호입니다.

    댓글

    • 나는 ‘가 ‘ 모델이 때때로 합리적이라고 주장합니다. 이러한 종속성을 적용하는 대신 리팩토링을 사용하여이를 방지 할 수 있습니다. h, 그리고 ‘ 충분히 털이 많아서 더 이상 기능으로 모듈화되지 않는 경우로 이어질 수 있습니다.) 한때 매우 복잡한 사용 사례가 프레임 워크에 영감을 주었을 때 이 작업을 수행 했습니다.
    • 함수로 나눌 필요가 있지만 예는 너무 멀리 걸립니다. 정말 나를 괴롭히는 유일한 것은 변수 선언 함수라고 생각합니다. 전역 변수, 특히 정적 변수는 해당 목적 전용 주석 섹션에서 전역 적으로 정의해야합니다. 동적 변수는이를 사용하고 수정하는 함수에 국한되어야합니다.
    • @Xalorous I ‘ 전역 변수가 초기화되는

    사례를 보았습니다. i> 절차에서, 외부 파일에서 값을 읽는 절차를 개발하기 전에 중간 및 빠른 단계로 … 정의와 초기화를 분리하는 것이 더 깨끗해야한다는 데 동의하지만 거의 구부릴 필요가 없습니다. 이점 3 번;-)

    답변

    전적으로 동의하지만 재사용 가능성 , 가독성 , 상사들에게 섬세하게 키스하지만 LDP가 보여 주듯이 :

    #!/bin/bash # ex62.sh: Global and local variables inside a function. func () { local loc_var=23 # Declared as local variable. echo # Uses the "local" builtin. echo "\"loc_var\" in function = $loc_var" global_var=999 # Not declared as local. # Therefore, defaults to global. echo "\"global_var\" in function = $global_var" } func # Now, to see if local variable "loc_var" exists outside the function. echo echo "\"loc_var\" outside function = $loc_var" # $loc_var outside function = # No, $loc_var not visible globally. echo "\"global_var\" outside function = $global_var" # $global_var outside function = 999 # $global_var is visible globally. echo exit 0 # In contrast to C, a Bash variable declared inside a function #+ is local ONLY if declared as such. 

    실제로는 자주 볼 수 없습니다. 쉘 스크립트이지만 더 복잡한 스크립트에 좋은 아이디어 인 것 같습니다. 응집 을 줄이면 “코드의 다른 부분에서 예상되는 변수를 방해하는 버그를 방지하는 데 도움이됩니다. .

    재사용 성은 종종 함수의 공통 라이브러리를 만들고 해당 라이브러리를 모든 스크립트에 source하는 것을 의미합니다. 이렇게하면 실행 속도가 빨라지는 것은 아니지만 빠르게 작성하는 데 도움이됩니다.

    댓글

    • 명시 적으로 local,하지만 함수로 분할 된 스크립트를 작성하는 대부분의 사람들은 여전히 디자인 원칙을 따른다고 생각합니다. Usign local는 버그를 도입하기 어렵게 만듭니다.
    • local는 함수와 그 하위 항목에 변수를 사용할 수 있도록하므로 ‘ 전달할 수있는 변수가 있으면 정말 좋습니다. 함수 A에서 떨어졌지만 함수 B에서는 사용할 수 없습니다. 이름은 같지만 목적이 다른 변수를 원할 수 있습니다.따라서 ‘ 범위를 정의하는 데 적합하며 Voo가 말했듯이 버그 감소

    답변

    C / C ++, python, perl, ruby 또는 기타 프로그래밍 언어 코드에 대해 수행하는 것과 동일한 이유로 코드를 함수로 분할합니다. 더 깊은 이유는 추상화입니다. 낮은 수준의 작업을 더 높은 수준의 기본 요소 (함수)로 캡슐화하여 작업이 수행되는 방식에 대해 신경 쓸 필요가 없습니다. 동시에 코드가 더 읽기 쉽고 유지 관리가 가능해집니다. 프로그램 로직이 더 명확 해졌습니다.

    하지만 여러분의 코드를 살펴보면 변수를 선언하는 함수가 있다는 것이 상당히 이상하다는 것을 알게되었습니다. 이로 인해 정말 눈을 뗄 수 없습니다.

    Comments

    • 과소 된 답변 IMHO. 그러면 main 함수 / 메소드에서 변수를 선언 하시겠습니까?

    답변

    다른 답변에서 이미 제공된 것과는 완전히 다른 이유 :이 기술이 때때로 사용되는 한 가지 이유는 최상위 수준의 non-function-definition 문은 main에 대한 호출이며 스크립트가 잘린 경우 스크립트가 실수로 불쾌한 작업을 수행하지 않도록하기위한 것입니다. 스크립트가 잘릴 수 있습니다. 만약 그렇다면 프로세스 A에서 프로세스 B (쉘)로 파이프되고 프로세스 A는 전체 스크립트 작성을 완료하기 전에 어떤 이유로 든 종료됩니다. 이는 프로세스 A가 원격 리소스에서 스크립트를 가져 오는 경우 특히 발생할 수 있습니다. 보안상의 이유로 좋은 생각은 아니지만 수행 된 작업이며 문제를 예상하도록 일부 스크립트가 수정되었습니다.

    댓글

    • 흥미 롭습니다! 그러나 저는 각 프로그램에서 이러한 것들을 처리해야한다는 것이 문제가됩니다. 반면에 정확히이 main() 패턴은 Python에서 일반적이며 파일 끝에 if __name__ == '__main__': main()를 사용합니다.
    • python 관용구는 main를 실행하지 않고도 다른 스크립트가 현재 스크립트를 import 할 수 있다는 장점이 있습니다. bash 스크립트에 유사한 가드를 넣을 수 있다고 생각합니다.
    • @Jake Cobb 예. 이제 모든 새로운 bash 스크립트에서이를 수행합니다. 모든 새 스크립트에서 사용하는 기능의 핵심 인프라가 포함 된 스크립트가 있습니다. 해당 스크립트는 소싱되거나 실행될 수 있습니다. 소싱 된 경우 주요 기능이 실행되지 않습니다. 소스 대 실행의 감지는 BASH_SOURCE에 실행 스크립트의 이름이 포함되어 있다는 사실을 통해 이루어집니다. 코어 스크립트와 ‘ 동일하면 스크립트가 실행됩니다. 그렇지 않으면 ‘ 소스가됩니다.
    • 이 답변과 밀접하게 관련된 bash는 이미 디스크에있는 파일에서 실행할 때 간단한 라인 기반 처리를 사용합니다. 스크립트가 실행되는 동안 파일이 변경되면 라인 카운터가 ‘ 변경되지 않으며 ‘ 잘못된 라인에서 계속됩니다. 모든 것을 함수로 캡슐화하면 ‘ 모든 항목을 실행하기 전에 메모리에 모두로드되므로 파일을 변경해도 ‘ 영향을받지 않습니다.

    li>

    답변

    프로그래밍에 대한 몇 가지 관련 진실 :

    • 상사가 그렇지 않다고 주장하더라도 프로그램은 변경됩니다.
    • 코드 및 입력 만 프로그램의 동작에 영향을줍니다.
    • 이름 지정 은 어렵습니다.

    댓글은 존재하지 않음을위한 임시 방편으로 시작됩니다. 당신의 생각을 코드 *로 명확하게 표현할 수 있고, 변화로 인해 더 나빠질 수 있습니다. 따라서 가능하다면 개념, 구조, 추론, 의미론, 흐름, 오류 처리 및 코드를 코드로 이해하는 것과 관련된 모든 것을 표현하십시오.

    그렇다면, Bash 함수에는 대부분의 언어에서 찾을 수없는 몇 가지 문제가 있습니다.

    • Bash에서 네임 스페이스는 끔찍합니다. 예를 들어 local 키워드를 사용하지 않으면 전역 네임 스페이스가 오염됩니다.
    • local foo="$(bar)"를 사용하면 bar 의 종료 코드를 잃었습니다 .
    • 이름이 지정된 매개 변수이므로 "$@"가 다른 상황에서 의미하는 바를 염두에 두어야합니다.

    * 이것이 문제가된다면 죄송합니다. 몇 년 동안 주석을 사용하고 몇 년 동안 주석없이 개발하는 경우 ** 어느 쪽이 더 우수한지 꽤 분명합니다.

    ** 라이센스, API 문서 등에 주석을 사용하는 것은 여전히 필요합니다.

    코멘트

    • 함수 시작 부분에 null을 선언하여 거의 모든 지역 변수를 설정합니다.local foo="" 그런 다음 명령 실행을 사용하여 결과를 처리하도록 설정합니다 … foo="$(bar)" || { echo "bar() failed"; return 1; }. 이것은 필요한 값을 설정할 수 없을 때 신속하게 기능을 종료합니다. 중괄호는 return 1가 실패한 경우에만 실행되도록하는 데 필요합니다.
    • 글 머리 기호에 대해 설명하고 싶습니다. ‘ 서브 셸 함수 ‘ (중괄호가 아닌 괄호로 구분 된 함수)를 사용하는 경우 1) don ‘ 로컬을 사용할 필요는 없지만 로컬의 이점을 누리십시오. 2) ‘

      많이 (‘ 로컬을 사용하지 않기 때문에) 3) ‘ 걱정할 필요가 없습니다. 실수로 오염되거나 전역 범위를 변경하는 것에 대해 4) ‘

    명명 된 매개 변수 ‘를 전달할 수 있습니다. ‘ 구문을 사용하여 함수에foo=bar baz=buz my-command

    답변

    프로세스에는 시퀀스가 필요합니다. 대부분의 작업은 순차적입니다. 주문을 엉망으로 만드는 것은 이치에 맞지 않습니다.

    그러나 스크립팅을 포함한 프로그래밍의 가장 큰 점은 테스트입니다. 테스트, 테스트, 테스트. 현재 스크립트의 정확성을 검증하기 위해 어떤 테스트 스크립트가 있습니까?

    상사는 스크립트 꼬마에서 프로그래머로 여러분을 안내하려고합니다. 이것은 들어가기에 좋은 방향입니다. 당신을 쫓는 사람들은 당신을 좋아할 것입니다.

    하지만. 항상 프로세스 지향적 뿌리를 기억하십시오. 일반적으로 실행되는 순서대로 함수를 정렬하는 것이 타당하다면 적어도 첫 번째 패스로 수행하십시오.

    나중에 일부 함수가 다음과 같은 것을 알게 될 것입니다. 입력, 다른 출력, 다른 처리, 다른 모델링 데이터 및 다른 데이터 조작을 처리하므로 유사한 메서드를 그룹화하는 것이 현명 할 수 있습니다. 아마도 별도의 파일로 이동할 수도 있습니다.

    나중에 많은 스크립트에서 사용하는 작은 도우미 함수 라이브러리를 작성했습니다.

    답변

    댓글 그리고 간격은 내가 설명 하겠지만 함수가 할 수있는 가독성에 가까워 질 수 없습니다 . 함수가 없으면 나무의 숲을 볼 수 없습니다. 큰 문제는 여러 줄에 숨겨져 있습니다. 즉, 사람들은 세밀한 부분과 큰 그림에 동시에 집중할 수 없습니다. 짧은 스크립트에서는 분명하지 않을 수 있습니다. 짧게 유지하는 한 충분히 읽을 수 있습니다. 소프트웨어는 더 커지지 만 작아지는 것은 아닙니다. , 그리고 확실히 그것은 당신 회사의 전체 소프트웨어 시스템의 일부입니다. 이것은 분명히 훨씬 더 큰, 아마도 수백만 줄일 것입니다.

    다음과 같은 지침을 제공했는지 고려하십시오.

    Place your hands on your desk. Tense your arm muscles. Extend your knee and hip joints. Relax your arms. Move your arms backwards. Move your left leg backwards. Move your right leg backwards. (continue for 10,000 more lines) 

    중간 또는 5 %까지 완료했을 때 처음 몇 단계가 무엇이 었는지 잊었을 것입니다. 당신은 대부분의 문제를 발견 할 수 없었습니다. 왜냐하면 당신은 나무에 대한 숲을 볼 수 없었기 때문입니다. 함수와 비교 :

    stand_up(); walk_to(break_room); pour(coffee); walk_to(office); 

    줄 단위 순차 버전에 주석을 몇 개 넣어도 훨씬 더 이해하기 쉽습니다. 또한 커피를 만드는 것을 잊었다는 것을 “알아낼 가능성이 훨씬 더 큽니다. 아마도 마지막에 sit_down ()을 잊어 버렸습니다. grep 및 awk 정규식에 대한 자세한 내용을 생각할 때 “커피를 만들지 않으면 어떨까요”라는 큰 그림을 생각할 수 없습니까?

    기능은 주로 큰 그림을 볼 수 있도록합니다. 커피를 만드는 것을 잊었거나 누군가가 차를 선호 할 수도 있다는 사실을 알 수 있습니다. 다른 시간에 다른 생각으로 세부 구현에 대해 걱정합니다.

    다음에서 논의 된 다른 이점도 있습니다. 다른 답변은 물론입니다. 다른 답변에서 명확하게 언급되지 않은 또 다른 이점은 함수가 버그 예방 및 수정에 중요한 보장을 제공한다는 것입니다. 적절한 함수 walk_to ()의 일부 변수 $ foo가 잘못되었다는 것을 발견하면 해당 문제의 영향을받을 수있는 모든 것과 가능한 모든 것을 찾기 위해 해당 함수의 다른 6 줄만 살펴보면됩니다. 그것이 잘못되었습니다. (적절한) 기능이 없으면 전체 시스템의 모든 것 및 모든 것이 $ foo가 잘못된 원인이 될 수 있으며, 모든 것 및 모든 것이 $ foo의 영향을받을 수 있습니다. 따라서 프로그램의 모든 행을 다시 검사하지 않고는 $ foo를 안전하게 고칠 수 없습니다. $ foo가 함수에 로컬이면 해당 함수 만 확인하여 모든 변경 사항이 안전하고 정확하다는 것을 보장 할 수 있습니다.

    댓글

    • 이것은 ‘ bash 구문이 아닙니다.하지만 ‘ 아쉽습니다. ‘ 그런 함수에 입력을 전달할 방법이 없다고 생각합니다. (예 : pour(); < coffee). c++ 또는 php (제 생각에)처럼 보입니다.
    • @ tjt263 (괄호 제외), it ‘의 bash 구문 : 커피를 따르세요. 괄호를 사용하면 ‘ 거의 모든 다른 언어에 해당합니다. 🙂

    답변

    시간은 돈입니다

    잠재적으로 스크립트를 모듈 식으로 작성해야하는 기술적 이유를 조명하는 다른 좋은 답변 이 있습니다. 길고, 작업 환경에서 개발되었으며, 사람 그룹 이 사용하도록 개발되었으며 자신의 용도로만 사용할 수 없습니다.

    하나의 기대에 집중 : 작업 환경에서 “시간은 돈입니다”. 따라서 버그가없고 코드의 성능이 가독성 , 테스트 가능성, 유지 보수 가능성, 리팩토링 가능성,

    재사용 가능성 …

    “로 작성 모듈 “ 코드는 코더 자체뿐만 아니라 테스터 또는 테스터가 사용하는 시간까지도 읽는 데 필요한 시간을 줄입니다. 상사. 또한 상사의 시간은 일반적으로 코더의 시간보다 더 많이 지불되며 상사는 업무의 질을 평가할 것입니다.

    더 나아가 독립적 인 “모듈” 코드 (bash 스크립트 포함)를 사용하면 다음과 함께 “parallel”에서 작업 할 수 있습니다. 팀의 다른 구성 요소는 전체 생산 시간을 단축하고 기껏해야 단일의 전문 지식을 사용하여 다른 부분에 부작용없이 부품을 검토하거나 다시 작성하고 방금 작성한 코드를 “있는 그대로” 다른 프로그램 / 스크립트, 라이브러리 (또는 스 니펫 라이브러리) 생성, 전체 크기 및 관련 오류 발생 가능성 감소, 각 단일 부분을 철저히 디버그 및 테스트합니다 … 물론 논리적으로 구성됩니다. 프로그램 / 스크립트를 섹션으로 나누고 가독성을 높입니다. 시간과 비용을 절약 할 수있는 모든 것. 단점은 표준을 고수하고 함수에 주석을 달아야한다는 것입니다. 작업 환경에서 할 필요가 없음).

    표준 을 준수하면 작업 속도가 느려집니다. 처음에는하지만 나중에는 다른 모든 사람 (그리고 여러분도)의 작업 속도를 높일 것입니다. 실제로 협업이 관련된 사람의 수가 증가하면 이는 피할 수없는 요구가됩니다. 예를 들어 전역 변수가 함수가 아니라 전역 적으로 정의되어야한다고 생각하더라도 는 항상 main() 하나의 첫 번째 줄에서 호출됩니다 …

    마지막으로, 최신 소스 코드의 가능성을 과소 평가하지 마세요. 선택적으로 별도의 루틴을 표시하거나 숨기는 편집자 ( 코드 접기 ). 이렇게하면 코드가 압축되고 사용자가 시간을 절약하는 데 집중할 수 있습니다.

    여기에 이미지 설명 입력

    위에서는 walk_into_bar() 함수 만 펼쳐진 방법을 볼 수 있습니다. 다른 코드들도 각각 1000 줄 길이 였지만 한 페이지에서 모든 코드를 계속 제어 할 수 있습니다. 변수를 선언 / 초기화하는 섹션도 접혀 있습니다.

    Answer

    또 다른 이유 종종 간과되는 것은 bash “의 구문 분석입니다.

    set -eu echo "this shouldn"t run" { echo "this shouldn"t run either" 

    이 스크립트는 분명히 구문 오류를 포함하고 있으며 bash는이를 전혀 실행하지 않아야합니다. 틀 렸습니다.

    ~ $ bash t1.sh this shouldn"t run t1.sh: line 7: syntax error: unexpected end of file 

    코드를 함수로 래핑하면 이런 일이 일어나지 않습니다.

    set -eu main() { echo "this shouldn"t run" { echo "this shouldn"t run either" } main 
    ~ $ bash t1.sh t1.sh: line 10: syntax error: unexpected end of file 

    답변

    다른 답변에 제공된 이유를 제외하고 :

    1. 심리 : 생산성이 코드 줄로 측정되는 프로그래머는 불필요하게 장황한 코드를 작성할 동기를 갖게됩니다. 관리가 많을수록 코드 줄에 집중할수록 프로그래머는 불필요한 복잡성으로 코드를 확장해야하는 인센티브가 증가합니다. 복잡성이 증가하면 유지 관리 비용이 증가하고 버그 수정에 필요한 노력이 증가하므로 바람직하지 않습니다.

    댓글

    • 비정 표가 말하는 것처럼 그렇게 나쁜 대답은 아닙니다. 참고 : agc는 이것이 가능하다고 말합니다. 그렇습니다. 그는 ‘ 그게 유일한 가능성이라고 말하지 않고 ‘ 아무도 비난하지 않고 사실만을 진술합니다. 오늘은 거의 들어 보지 못한 것 같지만 ” 코드 라인 “-> ” $$ ” 스타일 계약 작업은 매우 일반적이라는 것을 의미합니다. / bosses.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다