해석 된 프로그래밍 언어에 비해 쉘 스크립트의 장점은 무엇입니까? [닫은]


15

(여기에 적절한 질문인지 확실하지 않습니다)

로 작성된 쉘 스크립트 bash는 많은 작업을 수행 할 수 있습니다. 유닉스 프로그램을 호출하고, 출력을 파이프하고, I / O를 파일에서 /로 리디렉션하고, 흐름을 제어하고, 파일이 있는지 여부를 확인할 수 있습니다.

그러나 현대 프로그래밍 언어 (예 : pythonruby)도 이러한 작업을 수행 할 수 있습니다. 그리고 그들은 더 읽기 쉽고 유지 관리가 가능하다고 생각합니다.

bash널리 보급 채택. 그러나 많은 배포판에도 python인터프리터 가 설치되어 있습니다.

그렇다면 쉘 스크립트의 장점은 무엇입니까? 내가 쓸 수 있다면 python, ruby아니면 perl배울 가치가 bash있습니까?


3
유닉스 시스템에서 많은 일을한다면 bash와 다른 유닉스 쉘을 배워야한다.
Bernard

답변:


30

셸에는 파일을 다루고 한 프로그램에서 다른 프로그램으로 데이터를 가져 오는 데 필요한 특수 기능이 있습니다 (데이터가 텍스트라고 가정). 이러한 작업에서 쉘 스크립트는 Python과 같은 스크립팅 언어보다 덜 성 가실 수 있습니다.

셸 스크립팅은 사용하는 명령이 기본적으로 명령 줄에서 사용하는 것과 동일한 명령이라는 장점이 있으므로 셸에서 작업을 수행 할 수있는 경우 동일한 작업을 스크립팅하는 데 절반 이상이 걸립니다.

예를 들어 모든 PNG 파일을 현재 디렉토리에서 지정된 디렉토리로 이동하는 bash 스크립트가 있습니다.

#!/usr/bin/sh
mv *.png $1

여기 파이썬 버전이 있습니다.

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

당신은 알 수 있습니다 :

  • bash 스크립트는 줄을 세면 (세방 줄 제외) 파이썬보다 세 번째입니다.
  • Python 스크립트에는 세 개의 라이브러리를 가져와야하지만이 작업에 필요한 모든 것은 bash에서 기본적으로 사용 가능합니다
  • 파이썬 스크립트는 파일을 이동시키기 위해 명시적인 루프를 필요로하는 반면, 이것은 mvbash 에서 명령 의 의미론의 일부입니다
  • bash 스크립트는 더 빠르게 실행될 수 있습니다. bash에서 호출 source하면 쉘의 동일한 인스턴스에서 실행할 수 있습니다.
  • glob.iglob("./*.png") 그냥 말 만하면 *.png

파이썬에서 기본 파이프 연산을 작성하려면 자세한 정보가 놀라 울 것입니다. 물론 파이핑 스루와 같은 일부 grep는 외부 프로그램을 사용하는 대신 Python 코드로 대체 할 수 있으므로 파이프를 많이 만들 필요가없는 경우가 많습니다.

반례로서, 한 번은 특정 디렉토리에 각 파일 이름이 얼마나 오래 있는지 확인하는 루틴을 작성해야했습니다. 특정 OS에서 지원하는 것보다 긴 경우 단축해야합니다. 이로 인해 파일 이름이 중복되어 수정해야했으며 웹 페이지에서 연결되기 때문에 단축 된 이름은 안정적이어야했습니다. 즉, 동일한 긴 파일 이름이 항상 생성되는 방식으로 생성해야합니다. 동일한 단축 파일 이름. 나는 긴 파일 이름의 16 진수 md5를 생성하고 그 이름의 첫 네 문자를 단축 이름에 추가 하여이 작업을 수행했습니다 (이름은 여전히 ​​충돌 할 수 있지만 매우 어색하지 않았으므로 해당 조건을 확인하고 발생 해야하는 경우) .

이미 bash로 작성된 빌드 시스템의 일부이기 때문에 bash 에서이 작업을 수행했습니다. 당신이 생각하고있는 것만 큼 정확하게 맞추기가 어려웠습니다. 파이썬으로 작성하는 데 훨씬 적은 시간이 걸렸으며 아마도 더 명확했을 것입니다.

간단히 말해서, 다른 언어는 다른 종류의 작업을 위해 설계되었습니다. 업무에 가장 적합한 언어를 선택하십시오.


perl # / usr / bin / perl mv *.png $1(코멘트는 형식을 유지하지 않음) 에서 동일한 작업을 수행 할 수 없지만 perl에서는 고급 언어 기능을 사용할 수도 있습니다.
Poma

19

기존 답변도 유효하지만 아직 언급하지 않은 한 가지 이유가 있습니다. 왜냐하면 거기에 있기 때문입니다.

특정 * nix 설치는로드되거나로드되지 않을 수있는 선택적 패키지 세트로 수행되며 모든 시스템에 Python, Perl 또는 Ruby가있는 것은 아닙니다. 그러나 시스템에 대화 형 기능이 있다면 쉘을 갖게됩니다. 즉, 셸 스크립트는 서버에서 프로그래머의 데스크탑, 사무용 씬 클라이언트 데스크탑, 임베디드 장치, 쓰기 가능한 파일 시스템 및 bash 명령 줄을 지원하는 모든 시스템에서 시스템에서 작동합니다.

일관된 서버 환경에서만 일하는 사람에게는 당연한 것으로 여겨 질 수있는 것이 아닙니다. 보다 다양한 환경에서 일하는 사람에게는 간과해서는 안됩니다.


9

귀하의 질문 중 상당 부분이 여기에 답변됩니다 :

스크립트 언어 (예 : Perl, Python, Ruby)가 쉘 언어로 적합하지 않은 이유는 무엇입니까?

다음은 그 질문에 대한 대답 에서 발췌 한 것입니다 .

내가 생각할 수있는 몇 가지 차이점이 있습니다. 특별한 순서없이 여기에서 생각 스트리밍하십시오.

  1. Python & Co.는 스크립팅에 적합하도록 설계되었습니다. Bash & Co.는 절대로 타협하지 않고 스크립팅 에만 적합 하도록 설계되었습니다 . IOW : Python은 스크립팅과 비 스크립팅에 모두 적합하도록 설계되었으며 Bash는 스크립팅에만 관심이 있습니다.

  2. Bash & Co.는 형식화되지 않았고 Python & Co.는 강력하게 형식화되었으므로 숫자 123, 문자열 123및 파일 123이 상당히 다릅니다. 그러나 정적으로 유형이 지정 되지 않았으므로 구분하기 위해 다른 리터럴이 필요합니다. 예:

    • 루비 : 123(숫자), 배쉬 :123
    • 루비 : '123'(문자열), 배쉬 :123
    • 루비 : /123/(regexp), 배쉬 :123
    • 루비 : File.open('123')(파일), 배쉬 :123
    • 루비 : IO.open('123')(파일 기술자), 배쉬 :123
    • 루비 : URI.parse('123')(URI), 배쉬 :123
    • 루비 : `123`(명령), 배쉬 :123
  3. 파이썬 & 유한 확장 할 수 있도록 설계되어 최대 어쩌면 1000000 개 프로그램은, 강타 & 유한 확장 할 수 있도록 설계되어, 10000, 100000 아래로 10 개 문자 프로그램.

  4. Bash & Co.에서 파일, 디렉토리, 파일 설명자, 프로세스는 모두 일류 객체이며, 파이썬에서는 파일, 디렉토리 등을 조작하려면 Python 객체 만 일류입니다. 파이썬 객체 먼저.

  5. 쉘 프로그래밍은 기본적으로 데이터 흐름 프로그래밍입니다. 아무도 껍질을 쓰는 사람들조차도 그것을 알지 못하지만 껍질은 그것에 능숙하며 범용 언어는별로 그렇지 않다는 것을 알 수 있습니다. 범용 프로그래밍 세계에서 데이터 흐름은 프로그래밍 패러다임이 아니라 동시성 모델로 간주되는 것으로 보입니다.

기능이나 DSL을 범용 프로그래밍 언어에 볼트로 연결하여 이러한 요점을 해결하려는 시도가 효과가 없다고 생각합니다. 적어도 나는 설득력있는 구현을 아직 보지 못했다. 루비에는 쉘을 구현하려고하는 루쉬 (Ruby shell)가 있고, 루비에는 쉘 프로그래밍을위한 내부 DSL 인 러쉬 (rush)가 있으며, 파이썬 쉘인 핫 와이어 (hotwire)가 있지만 IMO는 그 어느 것도 가깝지 않습니다. Bash, Zsh, 물고기 및 친구들과 경쟁합니다.


브로큰 링크 :이 질문 (및 답변)은 어디에 있습니까? 아니면 여기에 유용한 모든 것이 있습니까?
울프

1
@Wolf : 거의 3 년이 지난 후에는 주제를 벗어난 것으로 삭제되었습니다. 운이 없었어.
Jörg W Mittag

1
다음은 그 질문의 보관 된 버전입니다 : web.archive.org/web/20140528035940/http://stackoverflow.com/...
waldyrious

1

쉘 스크립트는 매우 간단한 자동화 된 작업을 수행하려는 상황에서 이점이 있다고 말합니다. 예를 들어 매일 5 시마다 한 서버에서 다른 서버로 디렉토리를 백업하는 스크립트를 작성하려면 강력한 프로그래밍 언어를 사용하는 것이 과도합니다.

반면에, 프로그래밍 작업에 제어 구조 (if / then / else), 반복 구조 (루핑), 데이터베이스 및 파일 I / O 등이 더 필요한 경우 더 유능한 작업에 더 적합 할 것입니다 쉘 스크립트보다 프로그래밍 언어.

좋은 경험 법칙은 다음과 같습니다.

automatingSimpleTask ? shellScript() : programmingLanguage();

2
shellScript() if automatingSimpleTask else programmingLanguage() 롤 이되어서는 안됩니다 .
gahooa

1
@gahooa haha는 내가 어느 울타리에 있는지 보여줍니다!
CFL_Jeff 2016 년

1

python / ruby ​​/ whatever 프로그램에서 프로그램을 시작할 수는 있지만 쉘에서는 다릅니다. fork ()와 같은 무언가를 시작하기 위해 API를 사용해야 할 수도 있습니다. 쉘 스크립트에서 프로그램은 일반적인 프로그래밍 언어의 함수와 유사하게 작동하며 최소한의 노력으로 실행, 파이프 등을 수행 할 수 있습니다. 파이프를 사용하면 데이터 흐름이 매우 명확합니다.


0

특정 작업에 사용하는 프로그래밍 언어를 완전히 자유롭게 선택할 수 있다면 bash 학습을 거의 피하고 Perl, Python 또는 Ruby로 모든 스크립트 프로그래밍 작업을 수행 할 수 있습니다. 때로는 다른 Unix 도구 시퀀스를 호출하는 스크립트가 필요할 때 더 자세한 솔루션을 얻을 수 있지만 더 복잡한 경우에는 최신 스크립트 언어로 유지 관리하기 쉬운 코드를 작성할 가능성이 더 높습니다 (모호한 코드를 작성하는 데 더 많은 가능성을 제공하지만 원하는 선택입니다).

다른 한편으로, 우리는 종종 가장 좋아하는 언어를 자유롭게 선택할 수 없습니다. 우리는 bash를 알고 있지만 이름을 지정한 스크립팅 언어 중 하나를 모르는 사람이 작성한 레거시 코드 또는 코드로 작업해야하기 때문입니다.


0

쉘 스크립팅 해석 된 프로그래밍 언어입니다. 펄이나 파이썬 또는 다른 스크립팅 언어 대신 bash로 스크립트를 작성하는 몇 가지 이유는 다음과 같습니다.

모든 곳에서 작동 : 시스템 시작 또는 내장 시스템과 같이 더 복잡한 통역사를 항상 이용할 수있는 것은 아닙니다. Bash는 busybox에서도 사용할 수 있습니다.

커맨드 라인에서 작동 : 쉘 스크립팅에 정통한 경우 해당 기술을 사용하여 커맨드 라인에서 임시 스크립트에서 복잡한 작업을 수행 할 수 있습니다. 이 기술을 매일 sysadmin으로 사용합니다.

다른 프로그램을 호출하는 프로그램을보다 쉽게 ​​작성할 수 있습니다. 기존의 여러 프로그램을 흥미로운 방식으로 연결하는 것이 고급 언어보다 쉘 스크립트에서 수행하는 것이 더 간단 할 수 있습니다.

프로그램이 30 줄 이하이면 일반적으로 쉘 스크립팅을 사용하여 작성합니다. 복잡한 조작이나 복잡한 분석 또는 처리가 있으면 파이썬이나 펄을 사용하여 수행합니다.


-1

커피 스크립트를 살펴 봐야합니다. 그들의 말 :

모든 어색한 중괄호와 세미콜론 아래에서 JavaScript는 항상 멋진 객체 모델을 가지고 있습니다. CoffeeScript는 JavaScript의 좋은 부분을 간단한 방법으로 노출시키려는 시도입니다.

CoffeeScript의 황금률은 "단지 JavaScript"입니다.

글쎄 ... 여기 초급 답변이 온다.

지난 6 개월 동안 자동 학습 초보자로서, 마지막 날에 약간의 C, C ++, Javascript 및 더 많은 Bashscript를 시음하고 있습니다 ...

bash로 작성된 것과 같은 쉘 스크립트는 많은 작업을 수행 할 수 있습니다. 유닉스 프로그램을 호출하고, 출력을 파이프하고, 파일에서 I / O를 리디렉션하고, 흐름을 제어하고, 파일이 있는지 여부를 확인할 수 있습니다.

이 간단한 환상 이 아닙니다 ! ? 루프와 변수? 와!

파이썬과 루비도 이런 일을 할 수 있습니다. 그리고 그들은 더 읽기 쉽고 유지 관리가 가능하다고 생각합니다.

제발,이게 어디 있는지 말해줘? 나는에 bashscript 쓴 gedit를 도에 geany 나는 형식을 지정할 수 있습니다 (탭?) 나는 다른 언어을 비교 한 빛 사용 bashscript의 속도에 내 코드를 읽어 보시기 바랍니다.

이 언어에는 주문을 유지하기위한 다른 도구가 있습니까? 나는 객체 지향이 많은 코드를 저장한다는 것을 알고 있지만 사람들은 bashscript도 OO라고 말합니다! 와우 2! 이것이 나의 요점입니다. 가다 :

쉘 스크립트의 장점

이 질문 안에 있습니다 : 펄, 피톤 또는 루비 에서이 bashdamnthing무엇을 할 수 있습니까? 그것은 간단합니다?

( bashdamnthing = xdotool )


WTF가 진행되고 있습니까? 그것은 Doge의 대답과 비슷합니다.
naught101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.