Ruby를 활용한 명령줄 스크립팅 개선
기존 Unix 도구들의 한계를 극복하기 위해 Ruby의 스크립팅 기능을 적극 활용하는 방안이 제시됩니다. 핵심은 다음과 같은 Ruby의 기능을 활용하는 것입니다.
-e
옵션: Ruby 코드를 인라인으로 실행하여 즉석에서 명령을 처리할 수 있습니다.- 예시:
echo "foo" | ruby -e 'puts "hello #{STDIN.gets}"'
- 예시:
-n
옵션: 입력의 각 줄마다 Ruby 코드를 실행합니다.- 예시:
echo "foo bar" | ruby -n -e 'puts "hello #{$_}"'
- 예시:
개발 경험(DX) 개선을 위한 패턴
보다 효율적인 개발 경험을 위해 다음과 같은 패턴을 제안합니다.
- STDIN을 배열로 간주: STDIN을 단순히 한 줄씩 처리하는 것을 넘어, 전체 입력을 배열로 매핑하여 제어하는 방식입니다.
puts
또는print
자동 호출: 대부분의 경우 결과 출력을 위해puts
나print
를 사용하므로, 이를 간소화합니다.RUBYLIB
환경 변수 활용: 전역 디렉토리(~/_lib/ruby
등)에 사용자 정의 코드를 로드하여 재사용성을 높입니다.
사용자 정의 라이브러리 및 별칭
main.rb
:RUBYLIB
에 설정된 디렉토리 내에서json
과 같은 표준 라이브러리 및 다른 모든.rb
파일을 로드하는 역할을 합니다.misc.rb
: STDIN의 모든 줄을 문자열 배열로(II
), 또는 첫 번째 줄을(I
) 상수로 정의하여 접근성을 높입니다.rep
별칭:~/.zshrc
파일에alias re="ruby -r main.rb -e"
와function rep { re "puts $1" }
를 정의하여,ruby -r main.rb -e 'puts ...'
형태의 명령을rep '...'
로 간소화합니다.
실제 적용 사례
다양한 예시를 통해 rep
별칭과 사용자 정의 Ruby 코드가 기존 Unix 도구들을 어떻게 대체하고 더 복잡한 요구사항을 간결하게 처리하는지 보여줍니다.
- 줄 뒤집기:
awk
대신rep 'II.reverse.jn'
(여기서jn
은Array#join(" ")
의 사용자 정의 메서드). - 모든 단어 대문자화:
tr
대신rep 'II.map(&:upcase)'
. - 사용자 정의 JSON 형식: 복잡한 집계 및 정렬 요구사항을
cat FOO.txt | rep 'II.reduce(Hash.new { 0 }) { |m, v| m[v.split(" ")[0]] += 1; m}.group_by { it[1] }.transform_values { it.map(&:first).sort_by { -it.length } }.to_json'
와 같이 단일 Ruby 명령으로 처리합니다. 이는 기존 Unix 도구들로는 매우 어렵거나 불가능했던 작업입니다.