12P by neo 5달전 | favorite | 댓글 3개
  • Ruby는 Rails 프레임워크와 주로 연관되어 있어서 이 언어의 뛰어난 점을 잊는 경우가 많음
  • Ruby는 매우 풍부하고 완성된 언어로, 특히 복잡한 쉘 스크립트를 작성할 때 유용함
  • 이 글의 목표
    • 쉘 스크립트를 작성할 때 유용한 Ruby의 기능을 보여주고, Bash 및 Python과 비교
    • Bash 스크립트를 Ruby 스크립트로 완전히 대체하는 것 아님

기능 1: 외부 명령 호출

  • Ruby에서 외부 명령을 호출할 때 백틱(```)을 사용함.
  • 예를 들어, 백틱을 사용하면 외부 명령의 출력을 변수에 저장할 수 있음.
  • system 또는 popen을 사용할 수도 있음.
    `ls`  
    
  • 명령의 출력을 변수에 저장 가능.
    my_date=`date`  
    

기능 2: 상태 코드

  • $? 변수를 사용하여 마지막 명령의 상태 코드를 확인 가능
  • Bash와 매우 유사함
    `true`  
    puts $? # 0  
    `false`  
    puts $? # 1  
    

기능 3: 타입 언어

  • Ruby는 정적 타입 언어는 아니지만 타입을 가짐.
  • 객체 지향 언어로, 모든 것이 객체로 취급됨.
  • Bash와 달리 문자열 외의 타입을 안전하게 사용할 수 있음.
    total_lines = `wc -l my_file`.to_i # 파일의 라인 수를 포함하는 정수  
    half = total_lines.div 2           # 정수 나누기  
    puts `head -n #{half} my_file`     # 파일의 절반을 출력함  
    

기능 4: 함수형 구성

  • Ruby는 map, select (필터), reduce, flat_map 등의 함수형 연산을 메서드로 구현함.
  • 명령 출력에 map을 적용할 수 있음.
    puts `ls`.lines.map { |name| name.strip.length } # 파일 이름의 길이를 출력함  
    

기능 5: 정규 표현식 매칭

  • Ruby에서 정규 표현식은 타입으로, 정규 표현식을 사용하는 연산이 내장되어 있음.
  • 예를 들어, 현재 git 브랜치 이름을 가져오는 방법:
    current_branch_regex = /^\* (\S+)/  
    output_lines = `git branch`.lines  
    output_lines.each do |line|  
      if line =~ current_branch_regex # 문자열과 정규 표현식 매칭  
        puts $1                       # 첫 번째 그룹의 매칭을 출력함  
      end  
    end  
    

기능 6: 쉬운 스레드

  • Ruby는 여러 스레드를 다루기 매우 쉬움
  • 예를 들어, 여러 파일을 동시에 다운로드할 때 유용함
    (1..10).map do |i|                       # 1부터 10까지 반복  
      Thread.new do  
        `wget http://my_site.com/file_#{i}`  # 명령 내에서 변수를 사용할 수 있음  
      end  
    end.each { |thread| thread.join }        # do/end와 중괄호는 동일한 목적을 가짐  
    

기능 7: 내장 파일 및 디렉토리 작업

  • Ruby에서 모든 파일 연산은 File 클래스의 메서드, 디렉터리 연산은 Dir 클래스의 메서드로 제공됨.
  • Python과 달리 일관된 방식으로 파일과 디렉터리를 다룰 수 있음.
    exists = File.exists? 'My File'           # 불리언을 반환하는 메서드는 '?'로 끝남  
    file_content = File.open('My File').read  
    File.delete 'My File'                     # 괄호는 모호하지 않으면 선택 사항임  
    

결론

  • 복잡한 쉘 스크립트를 대체할 때 Ruby를 고려할 것을 추천
  • 물론 Bash를 완전히 버리라는 것은 아니지만, 복잡한 작업에서는 Ruby가 더 나은 선택일 수 있음
  • Python, Perl, JS 등으로도 가능하지만, 개인적으로는 Ruby가 가장 완전하고 쉽게 사용할 수 있는 언어임

GN⁺의 의견

  • Ruby는 객체 지향과 함수형 프로그래밍을 모두 지원하여 다양한 프로그래밍 스타일을 수용할 수 있음.
  • Python과 비교했을 때, Ruby는 더 엄격한 객체 지향 패러다임을 따름.
  • 쉘 스크립트 작성 시, 복잡도가 높아질수록 Ruby의 장점이 두드러짐.
  • Ruby의 스레드 처리 기능은 병렬 작업을 쉽게 구현할 수 있게 해줌.
  • 파일 및 디렉토리 작업이 직관적이고 일관성 있게 제공되어 생산성을 높임.

한때 애정했던 루비... 이런식으로라도(?) 많은 사랑을 받는 언어로 남으면 좋겠습니다.

스크립팅용으로 써도 괜찮겠네요 ㅎㅎ 버전은 모르지만 mac에도 기본 설치되어 있잖아요,,?!

Hacker News 의견
  • Ruby는 Perl에서 많은 셸 스크립팅 기능을 상속받았고, 점진적으로 가독성을 높일 수 있는 옵션을 제공함.
  • binding.irbbinding.pry를 사용하면 스크립트에서 인터랙티브하게 디버깅할 수 있음.
  • Pathname을 사용하면 File보다 자연스러운 API를 제공함.
  • 백틱(`)을 사용하면 간단한 셸 명령을 실행할 수 있지만, 더 복잡한 작업에는 Ruby의 표준 라이브러리를 활용할 수 있음.
  • Ruby의 스레드는 사용하기 쉬우며, Parallel을 사용하면 병렬 처리가 더욱 간편해짐.
  • MacOS에 기본 설치된 Ruby 2.6은 쓸만하지만, 최신 버전으로 업그레이드하는 것이 좋음.
  • Ruby는 훌륭한 언어지만, 편집기 지원이 Python에 비해 부족함.
  • 백틱(`)을 셸 명령 실행에 사용하는 것은 비효율적이며, OS에 따라 다르게 동작할 수 있음.
  • Ruby의 인라인 종속성 관리 기능은 매우 유용하며, Deno와 비슷한 기능을 제공함.
  • Ruby는 아름다운 코드 작성을 가능하게 하며, 작은 스크립트 작성에 적합함.
  • Ruby는 복잡한 자동화 스크립트 작성에 매우 유용하며, bash나 powershell보다 쉽게 작업할 수 있음.
  • Ruby는 대규모 레일즈 모놀리스를 사용하는 회사에서 여전히 많은 스크립팅과 도구 작성에 사용됨.
  • 인터넷에 접근할 수 없는 환경에서는 기본 배포판에 설치된 언어를 사용하는 것이 중요함.
  • Ruby는 셸 자동 완성 스크립트 작성에 유용하며, 빠르게 유틸리티를 만들 수 있음. Rails는 MVP 작성에 적합함.