답변:
일반적인 메인 프레임 흐름 ...
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
일반적인 Linux 흐름 ...
Input Disk/SSD/User (runtime) --> sh/bash/ksh/zsh/... ----------> Output Disk/SSD/Screen/Printer
| ^
v |
`--> Python script --------'
| ^
v |
`--> awk script -----------'
| ^
v |
`--> sed script -----------'
| ^
v |
`--> C/C++ program --------'
| ^
v |
`--- Java program ---------'
| ^
v |
: :
sh / ksh / bash / ... 와 같은 Linux 쉘 은 이전 메인 프레임 작업 제어 언어와 매우 유사한 입력 / 출력 / 흐름 제어 지정 기능을 제공합니다. O / S가 지원하는 모든 언어로 작성된 다른 실행 프로세스와 데이터 및 제어를 효율적으로 전달하도록 최적화 된 상태에서 자체적 으로 Turing 완전한 언어 입니다.
대부분의 Linux 응용 프로그램은 대부분의 프로그램이 작성된 언어에 관계없이 쉘 스크립트에 의존하며 Bash 가 가장 일반적입니다. 데스크탑에서 아이콘을 클릭하면 일반적으로 짧은 Bash 스크립트 가 실행됩니다 . 이 스크립트는 직접 또는 간접적으로 필요한 모든 파일이 어디에 있는지 알고 변수와 명령 줄 매개 변수를 설정하여 마지막으로 프로그램을 호출합니다. 이것은 쉘의 가장 간단한 사용입니다.
그러나 우리가 알고있는 Linux는 시스템을 시작하고, 이벤트에 응답하고, 실행 우선 순위를 제어하고, 프로그램을 컴파일, 구성 및 실행하는 수천 개의 쉘 스크립트가 없으면 Linux가 될 수 없습니다. 이들 중 다수는 상당히 크고 복잡합니다.
셸은 컴파일 타임이 아닌 런타임에 함께 연결되는 미리 빌드 된 구성 요소를 사용할 수있는 인프라를 제공합니다. 이러한 구성 요소는 단독으로 또는 재 컴파일없이 다른 조합으로 사용할 수있는 독립형 프로그램입니다. 이들을 호출하는 구문은 Bash 내장 명령 의 구문과 구별 할 수 없으며 실제로 시스템에 독립 실행 형 실행 파일이 있고 종종 추가 옵션이있는 수많은 내장 명령이 있습니다.
성능면에서 Python 과 Bash 사이에는 언어 차원의 차이가 없습니다 . 그것은 전적으로 각각이 어떻게 코딩되고 어떤 외부 도구가 호출되는지에 달려 있습니다.
모든 같은 잘 알려진 도구 나오지 AWK, 그렙, BC 주, DC, TR, 등은 먼지 중 하나의 언어로 그 작업을하고 떠날 것이다. Bash 는 Python 보다 Bash 를 사용하는 도구와 같은 도구에서 데이터를 다시 호출하고 전달하는 것이 더 쉽고 효율적이기 때문에 그래픽 사용자 인터페이스가없는 모든 경우에 선호됩니다 .
Bash 쉘 스크립트가 호출 하는 프로그램 과 전체 처리량 및 / 또는 응답 성이 동등한 Python 보다 좋거나 나쁠 지 여부에 따라 주어진 하위 작업에 대한 적합성에 따라 다릅니다 . 문제를 복잡하게 만들기 위해 Python 은 대부분의 언어와 마찬가지로 다른 실행 파일을 호출 할 수도 있지만 더 번거롭고 자주 사용되지는 않습니다.
Python 이 확실한 승자 인 한 영역 은 사용자 인터페이스입니다. 이는 기본적으로 GTK 그래픽을 지원하고 Bash 보다 훨씬 직관적이기 때문에 로컬 또는 클라이언트-서버 애플리케이션을 구축하는 데 탁월한 언어입니다 .
Bash 는 텍스트 만 이해합니다. GUI 및 데이터를 다시 전달하려면 다른 도구를 호출해야합니다. 파이썬 스크립트는 하나 개의 옵션입니다. 더 빠르지 만 덜 유연한 옵션은 YAD, Zenity 및 GTKDialog와 같은 바이너리 입니다.
반면 같은 껍질 배쉬 같은 GUI를 잘 작동 야드 , GtkDialog (임베디드 XML이 같은 GTK + 기능 인터페이스) , 대화 , 그리고 xmessage , 파이썬은 훨씬 더 할 수있는 등 더 복잡한 GUI 창입니다.
쉘 스크립트를 사용하여 빌드하는 것은 데스크탑 PC와 같은 기성 구성 요소로 컴퓨터를 조립하는 것과 같습니다.
Python으로 빌드 , C ++ 또는 대부분의 다른 언어 것이 더 함께 스마트 폰이 길을 칩 (라이브러리) 및 기타 전자 부품을 납땜하여 컴퓨터를 구축하는 것과 같다.
최상의 결과는 일반적으로 각자가 가장 잘하는 일을 할 수있는 언어 조합을 사용하여 얻을 수 있습니다. 한 개발자는 이것을 " 다국어 프로그래밍 " 이라고 부릅니다 .
일반적으로 bash는 python을 사용할 수없는 환경에서만 python보다 잘 작동합니다. :)
진지하게, 나는 매일 두 언어를 다뤄야하고, 선택이 주어진다면 즉시 bash를 통해 파이썬을 가져갈 것이다. 아아, 누군가가 (오해하게도 IMHO) 파이썬이 적합하기에 "너무 크다"고 결정했기 때문에 특정 "작은"플랫폼에서 bash를 사용해야합니다.
일부 선택 작업에 대해 bash가 Python보다 빠를 수 있다는 것은 사실이지만, 개발이 빠르거나 유지 관리가 쉽지는 않습니다 (적어도 10 줄 정도의 코드가 지나면). Bash의 유일한 장점은 파이썬이나 루비, 루아 등의 편재성입니다.
os또는 shutil모듈 명령 보다 훨씬 느립니다 .
bash와 Python이 합리적인 선택 인 시나리오에서 개발자 효율성 은 나에게 훨씬 더 중요합니다.
일부 작업은 bash에 적합하고 다른 작업은 Python에 적합합니다. bash 스크립트로 무언가를 시작하고 몇 주에 걸쳐 진화함에 따라 Python으로 변경하는 것도 드문 일이 아닙니다.
Python의 큰 장점은 파일 이름 처리와 관련된 코너 케이스에 있으며 일반적인 스크립팅 요구 사항을위한 glob , shutil , subprocess 및 기타 기능이 있습니다.
스크립트를 작성할 때 성능은 중요하지 않습니다 (대부분의 경우).
성능에 관심이 있다면 'Python vs Bash'는 잘못된 질문입니다.
Python :
+ 작성
하기 쉬움 + 유지
하기 쉬움 + 코드 재사용 용이 (일반 코드가있는 파일을 포함하는 보편적 인 오류 방지 방법을 찾으십시오. sh감히)
+ OOP도 가능합니다!
+ 더 쉬운 인수 구문 분석. 글쎄, 쉽지는 않습니다. 그것은 여전히 내 취향에 너무 장황 할 것 argparse입니다. 그러나 파이썬에는 기능이 내장되어 있습니다
.-추악한 '하위 프로세스'. 명령을 연결하고 코드가 얼마나 추악 해 질지 강하게 울지 마십시오. 특히 종료 코드에 관심이 있다면.
Bash :
+ ubiquity, 앞서 말했듯이 실제로.
+ 간단한 명령 체인. 이것이 다양한 명령을 간단한 방법으로 결합하는 방법입니다. 또한 Bash(아님 sh)과 같은 일부 개선 사항이 pipefail있으므로 연결이 정말 짧고 표현력이 좋습니다.
+ 타사 프로그램을 설치할 필요가 없습니다. 바로 실행할 수 있습니다.
-맙소사. IFS, CDPATH .. 수천 개.
하나는 스크립트를보다 큰 100 LOC를 작성하는 경우 선택 파이썬을
하면 스크립트에서 하나의 필요 경로 조작 : 선택 파이썬 (3)
필요 다소처럼 하나의 경우 alias선택 :하지만 약간 복잡 배쉬를 / 쉬
어쨌든, 그들이 무엇을 할 수 있는지 아이디어를 얻기 위해 양쪽 모두를 시도해야합니다.
패키징 및 IDE 지원 지점으로 대답을 확장 할 수 있지만이 측면에 대해 잘 모릅니다.
항상 그렇듯이 똥 샌드위치와 거대한 주물 중에서 선택해야합니다. 그리고 몇 년 전만해도 Perl은 새로운 희망이었습니다. 지금있는 곳.
성능면에서 bash는 프로세스 시작 시간에 python보다 성능이 뛰어납니다.
다음은 Linux Mint를 실행하는 핵심 i7 랩톱의 몇 가지 측정 값입니다.
Starting process Startup time
empty /bin/sh script 1.7 ms
empty /bin/bash script 2.8 ms
empty python script 11.1 ms
python script with a few libs* 110 ms
* Python로드 라이브러리 : os, os.path, json, 시간, 요청, 스레딩, 하위 프로세스
이것은 큰 차이를 보여 주지만 일반적으로 외부 프로세스를 호출해야하기 때문에 bash 실행 시간이 현명한 작업을 수행해야하는 경우 빠르게 저하됩니다.
성능에 관심이 있다면 bash는 다음 용도로만 사용하십시오.
/bin/echo배쉬보다이 정도 크기 때문에 측정하기가 어렵습니다. 따라서 bash를 실행하는 대신 /bin/echo mycommand > named_pipe(명령어 / 메시지를 명명 된 파이프 또는 소켓으로 출력) ... 사용하고 해당 파이프에서 명령 / 명령을 읽고 실행하는 백그라운드 Python 프로세스를 가질 수 있습니다. 따라서 bash는 실제로 좋은 "시작 비용 최적화"가 아닙니다.
Bash는 주로 배치 / 셸 스크립팅 언어로, 호환성 문제는 말할 것도없고 다양한 데이터 유형과 제어 구조에 대한 모든 종류의 단점을 훨씬 덜 지원합니다.
어느 것이 더 빠릅니까? 여기에서도 사과와 사과를 비교하지 않았기 때문입니다. ascii 텍스트 파일을 정렬해야하고 zcat, sort, uniq 및 sed와 같은 도구를 사용했다면 Python 성능을 현명하게 사용하게 될 것입니다.
그러나 부동 소수점 및 다양한 제어 흐름을 지원하는 적절한 프로그래밍 환경이 필요한 경우 Python이 승리합니다. Bash와 Python으로 재귀 알고리즘을 작성했다면 Python 버전이 몇 배 이상 승리 할 것입니다.
최소한의 노력으로 빠른 유틸리티를 함께 사용하려는 경우 bash가 좋습니다. 응용 프로그램을 둘러싼 래퍼의 경우 bash는 매우 유용합니다.
개선 사항을 추가하기 위해 계속해서 돌아와야 할 수있는 모든 것은 아마도 (항상은 아니지만) 파이썬과 같은 언어에 더 적합 할 것입니다. 1000 줄이 넘는 Bash 코드는 유지 관리가 매우 고통스러워지기 때문입니다. Bash 코드도 길어지면 디버깅을 짜증나게합니다 .......
이러한 종류의 질문에 대한 문제의 일부는 내 경험상 쉘 스크립트가 일반적으로 모두 사용자 지정 작업이라는 것입니다. 이미 무료로 사용할 수있는 솔루션이있는 곳에서 접한 쉘 스크립팅 작업은 거의 없었습니다.
주로 Google이이 질문을 좋아하기 때문에이 늦은 답변을 게시합니다.
문제와 맥락은 도구가 아니라 워크 플로에 관한 것이어야한다고 생각합니다. 전반적인 철학은 항상 "작업에 적합한 도구 사용"입니다. 그러나 그 전에는 많은 사람들이 도구에서 길을 잃었을 때 종종 잊어 버리는 "일을 완수하라"는 이야기가 나옵니다.
완전히 정의되지 않은 문제가 있으면 거의 항상 Bash로 시작합니다. 읽기와 유지 관리가 가능한 큰 Bash 스크립트에서 몇 가지 형편없는 문제를 해결했습니다.
하지만 언제 문제가 Bash에게 요청해야하는 작업을 초과하기 시작합니까? 경고를주기 위해 사용하는 몇 가지 수표가 있습니다.
목록은 계속됩니다. 결론적으로, 기능을 추가하는 스크립트를 계속 실행하기 위해 더 열심히 노력하고 있다면 Bash를 떠날 때입니다.
작업을 Python으로 옮기기로 결정했다고 가정 해 보겠습니다. Bash 스크립트가 깨끗한 경우 초기 변환은 매우 간단합니다. 첫 번째 패스를 수행 할 여러 변환기 / 번역가도 있습니다.
다음 질문은 : 파이썬으로 이전하는 것을 포기하는 것은 무엇입니까?
외부 유틸리티에 대한 모든 호출은 subprocess모듈 (또는 이와 동등한 것)의 무언가로 래핑되어야합니다 . 이 작업을 수행하는 방법은 여러 가지가 있으며 3.7까지 올바른 작업을 수행하기 위해 약간의 노력이 필요했습니다 (3.7은 subprocess.run()모든 일반적인 사례를 자체적으로 처리하도록 개선되었습니다 ).
놀랍게도 Python에는 키보드 (stdin) 폴링을위한 표준 플랫폼 독립적 인 비 차단 유틸리티 (시간 초과 포함)가 없습니다. Bash read명령은 간단한 사용자 상호 작용을위한 멋진 도구입니다. 필자의 가장 일반적인 용도는 사용자가 키를 누를 때까지 스피너를 표시하는 동시에 폴링 기능 (각 스피너 단계마다)을 실행하여 작업이 여전히 잘 실행되고 있는지 확인하는 것입니다. 이것은 처음에 나타나는 것보다 더 어려운 문제이므로 종종 Bash : Expensive에 전화를 걸지만 정확히 필요한 작업을 수행합니다.
임베디드 또는 메모리 제약이있는 시스템에서 개발하는 경우 Python의 메모리 공간은 Bash의 메모리 공간보다 몇 배 더 클 수 있습니다 (현재 작업에 따라 다름). 또한 거의 항상 메모리에 이미 Bash 인스턴스가 있으며 Python의 경우가 아닐 수 있습니다.
한 번 실행되고 빠르게 종료되는 스크립트의 경우 Python의 시작 시간이 Bash보다 훨씬 길 수 있습니다. 그러나 스크립트에 중요한 계산이 포함되어 있으면 Python이 빠르게 앞서갑니다.
파이썬은 지구상에서 가장 포괄적 인 패키지 시스템을 가지고 있습니다. Bash가 약간 복잡해지면 Python에는 Bash의 전체 청크를 단일 호출로 만드는 패키지가있을 수 있습니다. 그러나 사용할 올바른 패키지를 찾는 것은 Pythonista가되는 데있어 가장 크고 어려운 부분입니다. 다행히 Google과 StackExchange는 친구입니다.
이것이 정확한지 모르겠지만 수학적 계산이 많은 스크립트에서 python / ruby가 훨씬 더 잘 작동한다는 것을 발견했습니다. 그렇지 않으면 사용해야합니다dc 다른 "임의의 정밀 계산기" 합니다. 그것은 매우 큰 고통이됩니다. 파이썬을 사용하면 부동 소수점과 정수를 훨씬 더 많이 제어 할 수 있으며 많은 계산을 수행하는 것이 훨씬 쉽고 때로는 훨씬 쉽습니다.
특히 바이너리 정보 나 바이트를 처리하기 위해 bash 스크립트를 사용하지 않습니다. 대신 파이썬 (아마도) 또는 C ++ 또는 Node.JS와 같은 것을 사용합니다.
성능면에서 두 가지 모두 똑같이 똑같이 할 수 있으므로 개발 시간을 더 많이 절약 할 수있는 문제는 무엇입니까?
Bash는 다른 명령을 호출하고 새 명령을 만들기 위해 파이프에 의존합니다. 이것은 그들이 사용하는 프로그래밍 언어에 관계없이 다른 사람들로부터 빌린 코드로 새로운 프로그램을 빠르게 만들 수 있다는 장점이 있습니다.
이것은 또한 하위 명령 간의 인터페이스가 일반 텍스트이기 때문에 하위 명령의 변경에 저항하는 부작용도 있습니다.
또한 Bash는 글을 쓰는 방법에 대해 매우 관대합니다. 이것은 더 다양한 컨텍스트에서 잘 작동하지만, 또한 깨끗하고 안전한 방식으로 코딩하려는 의도를 가진 프로그래머에 의존한다는 것을 의미합니다. 그렇지 않으면 Bash는 당신이 엉망이되는 것을 막을 수 없습니다.
파이썬은 스타일에 대해 더 구조화되어 있으므로 지저분한 프로그래머는 그렇게 지저분하지 않습니다. 또한 Linux 외부의 운영 체제에서도 작동하므로 이러한 종류의 이식성이 필요한 경우 즉시 더 적합합니다.
그러나 다른 명령을 호출하는 것은 간단하지 않습니다. 따라서 운영 체제가 유닉스라면 Bash에서 개발하는 것이 가장 빠른 개발 방법이라는 것을 알게 될 것입니다.
Bash를 사용하는 경우 :
Python을 사용하는 경우 :