Bash를 언제 사용하고 언제 Perl / Python / Ruby를 사용합니까? [닫은]


78

우리는 지금까지 Bash를 사용하여 모든 스크립팅을 수행하고 있지만 조금 바보 스럽습니다. 물론 Bash로 원하는 모든 작업을 수행 할 수 있지만 (강력한) 대신 적절한 스크립팅 언어 (우리의 경우에는 Ruby)를 사용하지 않아야하는지 궁금해지기 시작했습니다.

스크립트에 Perl / Python / Ruby over Bash를 언제 사용할지 어떻게 결정합니까? Ruby를 사용하는 init 스크립트는 의미가 없다고 생각하지만 전자 메일 계정을 추가하는 약간 긴 스크립트는 어떻습니까?


1
둘 중 하나를 사용하여 할 수 있다면 정말 중요합니까? 결과 스크립트에 차이가있는 경우에만 선택이 흥미 롭습니다. 예를 들어 실행 시간이 크게 다를 수 있습니다 (이메일 계정의 경우에는 문제가 아님).
데니스

답변:


44

둘 다 다룰 수있는 문제가 있다면 가장 편한 것을 사용하고 싶을 것이다. 궁극적으로 많은 세부 사항이 있으며 경험만이 세부 사항을 볼 수 있습니다.

Bash는 Python, Ruby, Perl과 같은 범용 스크립팅 언어이지만 나머지는 서로 다른 강점을 가지고 있습니다. 텍스트 분석에서 펄 엑셀, 파이썬은 가장 우아하다고 주장합니다. Bash 스크립트는 "파이핑 스터핑"이 뛰어납니다. 방법.

그러나, 당신이 당신의 벨트에서 건강한 스크립팅 경험을 한 후에 만 ​​차이점이 중요합니다. 한 언어를 골라 한도 내로 밀어 내고 다음 언어로 넘어가는 것이 좋습니다. 대부분의 사람들이 인정하는 것보다 쉘 스크립트에서 많은 것을 할 수 있습니다. 모든 언어는 원하는만큼 어렵습니다. 몇 가지를 쓴 후에는 모든 언어가 "쉬운"것입니다.

리눅스에 익숙하다면 쉘에 친숙해지면 빨리 보상을받을 수있다. 쉘 스크립트로 해결할 수 없거나 불가능한 작업을 찾으면 다른 것을 사용하십시오.

또한 쉘 스크립팅을 배우는 것은 매우 간단하다는 것을 명심하십시오. 그것의 진정한 힘은 awk, sed, tr 등과 같은 다른 프로그램에 있습니다.


Ruby와 마찬가지로 bash 스크립팅에 대한 경험이 있지만 때로는 무엇을 사용 해야할지 모르겠습니다. 그 순간에 개인 취향에 따라 선택하는 것은 어리석은 것처럼 보입니다. 하지만 네 말이 맞아, 내가하고 싶은 일을 스스로에게 물어보고 작업에 가장 적합한 도구를 선택합니다.
futlib

개인적으로, 내가 알고있는 언어의 규모를 복잡성과 힘의 오름차순으로 사용하고 청구서에 맞는 가장 간단한 것을 사용합니다. 그러나 실제로 확실하게 알 수있는 유일한 방법은 모든 언어로 스크립트를 작성하고 결과를 비교하는 것입니다. 그것은 확실성보다 더 직감입니다. 몇 년 동안 스크립트를 작성하면 대부분의 "문제 유형"을 발견하고 어떤 언어로 문제를 해결했는지 알게 될 것입니다.
mkaito

GNU coreutils 패키지 (tr, sort, uniq 등)에서 작은 프로그램을 사용하여 파이프를 추가하고 많은 작업을 수행 할 수 있다고 덧붙였습니다.
GMaster

58

TL; DR- 더 나은 언어를 설치하기 위해서만 bash를 사용 하십시오 (아직 사용 가능하지 않은 경우). 실수로 명령 행에서 직접 수행 할 수없는 경우 bash / shell로 스크립트하지 마십시오.

2015 년이므로 다음을 고려할 것입니다.

  1. 메모리 오버 헤드

    • bash와 비교할 때 Ruby / Python 런타임 메모리 오버 헤드는 작지만 (공유 라이브러리로 인해) 어쨌든 중요하지 않은 bash 스크립트를 유지할 수는 없습니다 (즉,> 100 줄이있는 스크립트). 따라서 메모리 사용량은 중요하지 않습니다.
  2. 시작 시간

    • 루비 / 파이썬 시작은 약간 느려질 수 있지만, 초당 100 번 타이트한 루프로 전체 루비 / 파이썬 프로세스를 많이 실행하지 않을 가능성이 있습니다 (필요한 경우 bash / shell은 어쨌든 너무 많은 오버 헤드가 있고 아마도 C / C ++로 떨어질 필요가 있습니다)
  3. 공연

    • 루비 / 파이썬에서는 거의 모든 일반적인 데이터 크 런칭이 더 빠를 것입니다. 또는 적어도 비슷한 수준입니다.
    • 실제 성능 / 병목 현상 (또는 생산성)은 거의 항상 "bash / shell 사용 부족" 될 것입니다 (시작을위한 Ubuntu 스위칭 대시조차도 bash가 실제로 문제가되는 방법을 보여줍니다. busybox는 아마도 유일한 유스 케이스입니다) 거기에 있기 때문 입니다 작성하고 코드를 실행할 수있는 '배쉬'와 'VI'에 지나지 등) 추가 / 다운로드 또는 다른 작업을 저장할 수있는 방법은 종종 없다
    • 작업을 수행하기 위해 다른 프로세스를 실행하는 것 (sed / awk / grep 등)은 실제로 메모리의 라이브 객체에서 메소드를 호출하는 것보다 훨씬 느립니다.
  4. 생산력

    • Ruby / Python에서 "실제"메소드, 매개 변수, 변수 및 예외를 사용하는 것에 비해 Bash / shell에서 실수를하기가 너무 쉽습니다.
    • 애자일은 주류이지만 Bash는 지원하지 않습니다 (단위 테스트 기능 부족, 라이브러리, OO, 모듈화, 보푸라기, 내부 검사, 로깅, 메타 프로그래밍; 무언가를 깨뜨리지 않고 리팩터링하는 것은 거의 불가능합니다)
    • 다른 쉘과의 비 호환성이 너무 크면 사소한 환경 변수가 스크립트를 완전히 깨뜨릴 수 있습니다 (Puppet과 같은 중요한 dev-ops 도구는 shebang 행을 무시하고 중요한 쉘 변수를 전달하거나 다시 씁니다) Ruby / Python은 비교적 부드럽게 마이그레이션됩니다. 주요 버전 변경에 대한 경로
    • 새로운 언어를 배우는 데는 쉘 관련 문제 (특히 변수 이름, 부울 없음, 예외 없음)로 인해 쉘 스크립트를 디버깅하는 데 소요되는 시간의 일부가 걸립니다.
    • 심지어 시작 스크립트조차도 지뢰 ( 특히 시스템 시작 중에 실패 할 수 있기 때문에 )이며 bash의 최근 보안 결함이 있으면 일반 C (좋은 라이브러리가 있음)를 사용하는 것이 좋습니다. 예, C는 컴파일, 구성 등이 필요합니다. 그러나 간단한 쉘 스크립트조차도 저장소, 버전 관리, 패키징이 필요할 수 있습니다.
    • 어떤 / 그렙 가능성이 이미 루비 / 파이썬에 내장되어 SED / AWK로 사용할 수 있습니다 - 그것은 의존성, 또는 플랫폼에서 이러한 도구의 버전 사이의 "차이"(그래서에서 작동하는 경우 어떤없이 당신의 설정)
  5. 고용 안정
    • 당신이 싫어하는 직업을 확보하는 요점은 무엇입니까? (당신이 그 시간을 디버그하기 쉽지 않지만 사소한 쉘 스크립트 버그를 쓰는 것을 좋아하지 않는다면)

Ruby / Python을 설치 한 경우 Bash / Shell을 사용할 이유가 없습니다.

그리고 아마도 Ruby / Python을 설치한다고해서 처음에는 bash 스크립트가 필요하지 않을 것입니다 (busybox를 제외하고 일부 시스템 도구는 Python / Perl에 의존합니다).

그리고 쉘 스크립트를 작성할 때마다보다 강력하고 생산적인 것을 배우는 대신 정확하게 연습하는 것입니다.

요즘 사람들은 왜 배쉬를 사용합니까? 끔찍하고 깨지기 힘든 습관이기 때문입니다. 사람들이 아무리 강하게 생각하는 경향이 있더라도 처음 몇 분 후에 스크립트가 "영원히 끝나지"않습니다. "이 스크립트의 마지막 버그"오류와 함께 오류가 발생했습니다.

결론 : 당신이 절대적으로하는 경우에만 때 bash는 / 쉘을 사용 강제 (등에 ~/.bashrc거의 없기 때문에, 비지 박스) 결코 요즘 "작업에 적합한 도구".


28

주된 관심사가 파일 처리에 집중할 때 bash를 사용합니다. 여기에는 파일 이동, 복사 및 이름 바꾸기, 파일을 다른 프로그램의 입력으로 사용하거나 다른 프로그램의 출력을 파일에 저장하는 것이 포함될 수 있습니다. 실제로 파일의 내용을 검사하거나 출력을 생성하여 파일에 쓰는 bash 코드는 거의 작성하지 않습니다. 나는 그것을 bash를 통해 시작하는 다른 프로그램 (Perl 또는 python으로 작성할 수 있음)에 남겨 둡니다.

필자는 파일에서 데이터를 읽고, 어떤 방식 으로든 데이터를 처리하고, 출력을 파일에 쓰는 데 중점을 둘 때 Perl과 python을 사용합니다. (Perl에서) system명령을 사용 하거나 subprocess모듈을 너무 진지하게 (파이썬으로) 사용 하면 스크립트를 bash로 작성하는 것이 좋습니다. 반면에, 때로는 bash 스크립트에 너무 많은 기능을 추가하기 시작하여 가변 범위 지정, 함수, 데이터 구조 등에 대한 bash의 제한된 (비교) 지원을 처리하는 대신 Perl / python에서 다시 작성하는 것이 더 합리적입니다. .


2
나는 파일 읽기 / 텍스트 생성이 필요할 때마다 t0을 Bash에서 보석으로 사용했지만 =~지원 하는 연산자를 배우고 나면 간단한 파일 읽기를 [[ ]]위한 Bash를 좋아 했습니다.
Freedom_Ben

16

이 블로그 게시물에 설정된 기준이 마음에 듭니다 .

  • 전달할 인수가 없으면 쉘 스크립트 일 수 있습니다.
  • 제어 로직이 많지 않은 경우 (단일 루프 또는 if / else 이외) 쉘 스크립트 일 것입니다.
  • 작업이 명령 줄 지침의 자동화 인 경우 거의 확실하게 쉘 스크립트입니다.

8

이 Perl 대 Bash 분석이 유용하다는 것을 알았습니다 ...

http://blogs.perl.org/users/buddy_burden/2012/04/perl-vs-shell-scripts.html

편의상, 나는 저자의 1) bash가 더 나은 결과 일 때와 2) perl이 더 나은 결론 일 때의 요약을 복사하고 있습니다 ...

배쉬가 더 나을 때 ...

  • 직업 실패
  • 종료 명령
  • 작업 출력 라인 처리
  • 여기 문서
  • 파일 동등성
  • 파일 타임 스탬프 비교
  • 물결 확장

펄이 더 나을 때 ...

Perl은 여전히 ​​대부분의 응용 프로그램에서 bash를 능가합니다. 내가 Perl을 선호하는 이유는 다음과 같습니다.

  • 더 빨라질 것입니다. 주로 내가하고 싶은 많은 일에 대해 실제로 새로운 프로세스를 시작할 필요가 없기 때문에 (기본 이름과 dirname이 가장 명백한 예이지만 일반적으로 cut, grep, sort 및 wc도 모두 제거 할 수 있습니다).
  • bash의 문자열 처리는 기껏해야 초보이며 $ IFS 전체는 매우 어수선합니다.
  • 셸 스크립트의 조건은 어색 할 수 있습니다.
  • 쉘 스크립트에서 인용하는 것은 악몽 일 수 있습니다.
  • bash의 사례 진술은 단순한 사례 (NPI)를 넘어서는 것이 좋습니다.
  • bash sucks의 배열. 배쉬의 해시 (너의 배쉬가 완전히 새로운 것으로 가정하면)는 훨씬 더 빨라진다.
  • 파일을 처리하거나 명령 출력이 위에 나열된 간단한 경우를 넘어 서면 Perl은 실제로 담배를 피우기 시작합니다.
  • CPAN.

그래서 배쉬가 Perl을 곧 장악 할 것 같지는 않습니다. 그러나 나는 수년이 지난 후에도 간단한 셸 스크립트가 때로는 간단한 Perl 스크립트보다 더 간단 할 수 있다는 것을 여전히 알았습니다. 내가 말했듯이, 나는 달리 설득하려는 모든 시도를 환영합니다. 그러나 도구 상자에 몇 가지 다른 도구가 있으면 아무 문제가 없습니다.


흥미롭게도 Ruby에는 at_exit (), realpath (), expand_path (), stat (), heredocs 및 예외 ( fail "error" unless system("foobar")) 가 있기 때문에 모든 점 (?)이 적용되지 않습니다 .
Cezary Baginski

5

내 경험상 bash 대 python은 개발 시간과 유연성 사이의 균형입니다. 문제에 대한 기본적인 해결책은 일반적으로 python 스크립트에서보다 bash 스크립트에서 더 빠르게 설정할 수 있습니다.

파이썬은 동등한 bash 스크립트보다 솔루션의 구조에 대해 더 많이 생각하는 경향이 있습니다. 파이썬은 bash 스크립트보다 표현력이 뛰어나므로 시간이 지남에 따라 확장 및 수정되는 경향이 있습니다. 또한 일반적으로 더 읽기 쉽습니다.

Bash는 파일 시스템에 더 가깝고 잘 정의되지 않은 문제에 대한 초안 솔루션에 유용 할 수 있습니다. 이러한 이유로 bash 스크립트는 일단 문제가 잘 이해되면 파이썬으로 포팅하려는 의도로 무언가 프로토 타입을 만드는 것이 가장 좋습니다.


4

Bash는 유닉스 쉘이며 스크립팅 언어를 포함합니다. 오히려 명령 프로세서입니다. 명령을 실행하는 방법을 제어하고 실제로 명령을 실행합니다.

Perl / Ruby / Python은 범용 언어입니다.

쉘 스크립트를 원할 때 Bash를 사용하십시오.

더 복잡한 작업을 원하거나 쉘과 관련이없는 경우. 파이썬 등을 사용하십시오.

나는이 언어들을 실제로 비교하지 않을 것이다. 파이썬 등은 이식성이 있습니다. 어디서나 실행할 수 있습니다. 배쉬는 유닉스 전용입니다.

파이썬 등은 수많은 재사용 가능한 라이브러리로 수백만 개의 작업을 해결합니다.

당신이 묻는다면 거의 동일합니다. "페인트 사용시기 및 Photoshop 사용시기"

이메일 처리에는 재사용 가능한 라이브러리가 많기 때문에 Ruby를 다시 사용합니다.

그러나 가장 좋은 방법은 bash와 ruby를 결합하는 것입니다. 맞습니다. 루비에서 전자 메일 처리 스크립트를 만들고 bash 스크립트는 해당 루비 스크립트를 호출하고 다른 commans ds를 실행합니다.

따라서 명령 프로세서가 필요할 때마다 bash를 사용하십시오. 유닉스 명령을 실행하고 제어합니다.

7 년 후 업데이트 (2019 년 3 월)

내 대답의 주요 부분은 바뀌지 않았지만 그 점을 지적하고 싶습니다.

Bash는 강력한 스크립팅 언어이기도합니다. 텍스트 처리를 위해서는 절대적으로 합법적 인 선택이 될 수 있습니다.

아래 mkaito의 의견을 읽으십시오. 그들은 모두 사실입니다.


1
Bash의 스크립팅 하위 집합은 일반 스크립팅 언어와 마찬가지로 일반적인 목적입니다. sed와 같은 일반적인 프로그램을 믹스에 추가하면 모든 스크립팅 요구의 90 %가 적용됩니다.
mkaito

1
그 힘은 다른 유닉스 명령과 등 나오지 언급 한 자신의 scripts.like의 프로그램이 그 특정 언어를 선택할 때 요구되는 실행하는 것입니다, 그래서 배쉬는 명령 프로세서
bakytn

1
쉘은 실제로 영광스러운 프로그램 실행기이지만 스크립팅 기능은 그 이상입니다. 실제 쉘 스크립팅을 배우는 것이 좋습니다.
mkaito

나는 바닥에서 잠을 잘 수 있지만 오히려 침대에서 할 것입니다. 언어는 서로 다른 목적을 가지고 비교 될 수 없습니다.
bakytn

2
Bash가 바닥이라면 Haskell과 같은 것이 네일 보드 여야합니다 :-)
mkaito

1

bash, ksh, zsh, sh 및 fish와 같은 셸 스크립트는 Ruby, Python 또는 Perl과 같은 고급 범용 언어에 비해 놀랍습니다. 쉘 스크립트는 동등한 범용 스크립트보다 짧은 파일로 수명을 시작할 수 있지만, 놀랍게도 set -euo pipefail엄격한 모드를 활성화하는 것과 같은 많은 방어 적 래핑 코드가 발생 합니다.

예를 들어, 대부분의 쉘 언어는 명령 중 하나가 실패하더라도 쉘 스크립트에서 행을 계속 실행합니다. 대조적으로, 범용 언어는 첫 번째 오류에서 즉시 실패하고 종종로드되기 때문에 가벼운 복잡성 스크립트에서도보다 안전하고 예측 가능한 동작이 발생합니다.


1

매우 편향된 기사.

bash가 디버그하기가 어렵다는 것을 알지 못합니다. 파이썬은 종종 너무 단단하지만 bash는 매우 창의적입니다. 당신이 좋은 즉시 생각하는 사람이라면 배쉬를 좋아할 것입니다.

수천 개의 파일에서 수백만 개의 DNA 시퀀싱 판독에서 bash 스크립트를 실행하면 제대로 작동합니다. 그리고 모든 사람의 말과는 달리, C ++의 동일한 버전의 스크립트는 실제로 몇 분만에 훨씬 더 빠르게 실행되지는 않습니다.

펄과 같은 bash는 가장 사용자 친화적이거나 읽기 쉽지 않습니다. 대부분의 사람들은 훌륭한 추상 사상가가 아니기 때문에 사람들을 놀라게합니다. 그러나 더 밝고 창의적인 프로그래머는 그것을 좋아하고 자주 사용하는 경향이 있습니다. 자신을 알고 있고 두뇌가 있다는 것을 알고 있다면 강타로 겁내지 마십시오. 기본 사상가라면 파이썬과 같은 것을 고수하십시오. 각자 자신에게.


0

"라마 서"에서

Perl은 낮은 수준의 프로그래밍 (예 : C 또는 C ++ 또는 어셈블리)과 높은 수준의 프로그래밍 (예 : "쉘"프로그래밍 (예 : bash])) 사이의 차이를 메 웁니다 . 저수준 프로그래밍은 일반적으로 작성하기 어렵고 추악하지만 빠르며 무제한입니다. 주어진 기계에서 잘 작성된 저수준 프로그램의 속도를 능가하기는 어렵습니다. 그리고 당신이 할 수있는 일은 많지 않습니다. 반면에, 고수준 프로그래밍은 느리고, 어렵고, 추악하고 제한적인 경향이 있습니다. 시스템에 필요한 기능을 제공하는 명령이 없으면 셸 또는 배치 프로그래밍으로 전혀 할 수없는 일이 많이 있습니다. Perl은 쉽고, 거의 무제한이며, 대부분 빠르고, 추악합니다.


0

경험에 비추어 볼 때 현재 수행중인 작업에 충분한 성능을 제공 하는 가장 간단한 언어 를 사용하십시오 . 그리고 그 확장 성만으로도 실제로 유용합니다.

가독성에 대해서는 프로그래밍 스타일이 끔찍한 경우 Bash가 끔찍합니다. 저기서 코드를 던지면 모호하게됩니다.

그러나 코드를 가장 짧은 함수 로 나누고 이해하기 쉬운 간단한 방법으로 이름을 지정하면 찾을 수있는 가장 명확한 언어입니다. 매우 간결하기 때문입니다.

표본으로, 이것은 Bash의 최신 코드입니다. 이해하고 타이핑하는 것이 얼마나 쉬운 지 주목하십시오 :

#! /bin/bash


mainFunction () {
    file="${1}"

    checkFile "${file}"
    executeFile "${file}"
}


changeToThisProgramDir () {
    cd "$( dirname "${BASH_SOURCE[0]}" )"
}


checkFile () {
    file="${1}"

    checkFileNotEmpty "${file}"
    checkFileExist "${file}"
    checkFileIsExe "${file}"
}


checkFileExist () {
    file="${1}"

    if [ ! -f "${file}" ]; then
        echo "The file doesn't exist: ${file}" >&2
        echo "If the name was correct either type: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}


checkFileIsExe () {
    file="${1}"
    mime=$(fileMime "${file}")

    if [ "${mime}" != "application/x-dosexec" ]; then
        echo "Not an exe: ${file}" >&2
        exit 1
    fi
}


checkFileNotEmpty () {
    file="${1}"

    if [ "${file}" == "" ]; then
        echo "No file specified" >&2
        echo "Either type this: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}


execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: ${error}" >&2
        exit 1
    fi
}


executeFile () {
    file="${1}"
    type=$(fileType "${file}")

    if [ "${type}" == "MS-DOS executable" ]; then
        execute "executeFile" "dosbox \"${file}\" -forcescaler normal2x -exit -fullscreen"
    else
        execute "executeFile" "wine \"${file}\""
    fi
}


fileMime () {
    file="${1}"

    attributes=$(file --brief --mime "${file}")
    IFS=";" read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}


fileType () {
    file="${1}"

    attributes=$(file --brief "${file}")
    IFS="," read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}


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