12P by neo 11일전 | favorite | 댓글 2개
  • 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의 스레드 처리 기능은 병렬 작업을 쉽게 구현할 수 있게 해줌.
  • 파일 및 디렉토리 작업이 직관적이고 일관성 있게 제공되어 생산성을 높임.
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 작성에 적합함.

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