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