[ruby] 쉘 스크립팅에 Ruby를 어떻게 사용합니까?

내가하고 싶은 간단한 쉘 스크립팅 작업이 있습니다.

예를 들면 다음과 같습니다. 일부 정규식과 일치하는 파일 목록에서 작업 디렉토리의 파일을 선택합니다.

나는 표준 bash와 grep을 사용하여 이런 종류의 일을 할 수 있다는 것을 알고 있지만 명령 줄 프로그램과 플래그 등을 기억하지 않고도 Windows와 Linux에서 작동하는 빠른 스크립트를 해킹 할 수 있다는 것이 좋을 것입니다.

나는이 일을하려고했지만 현재 디렉토리에 대한 참조와 같은 정보를 어디에서 얻을 수 있는지 혼란스러워졌습니다.

질문은 루비 쉘 스크립트를 작성하기 위해 루비 라이브러리의 어떤 부분을 알아야합니까?



답변

기본적으로 이미 DirFile에 액세스 할 수 있으며 이는 매우 유용합니다.

Dir['*.rb'] #basic globs
Dir['**/*.rb'] #** == any depth of directory, including current dir.
#=> array of relative names

File.expand_path('~/file.txt') #=> "/User/mat/file.txt"
File.dirname('dir/file.txt') #=> 'dir'
File.basename('dir/file.txt') #=> 'file.txt'
File.join('a', 'bunch', 'of', 'strings') #=> 'a/bunch/of/strings'

__FILE__ #=> the name of the current file

stdlib에서도 유용합니다. FileUtils

require 'fileutils' #I know, no underscore is not ruby-like
include FileUtils
# Gives you access (without prepending by 'FileUtils.') to
cd(dir, options)
cd(dir, options) {|dir| .... }
pwd()
mkdir(dir, options)
mkdir(list, options)
mkdir_p(dir, options)
mkdir_p(list, options)
rmdir(dir, options)
rmdir(list, options)
ln(old, new, options)
ln(list, destdir, options)
ln_s(old, new, options)
ln_s(list, destdir, options)
ln_sf(src, dest, options)
cp(src, dest, options)
cp(list, dir, options)
cp_r(src, dest, options)
cp_r(list, dir, options)
mv(src, dest, options)
mv(list, dir, options)
rm(list, options)
rm_r(list, options)
rm_rf(list, options)
install(src, dest, mode = <src's>, options)
chmod(mode, list, options)
chmod_R(mode, list, options)
chown(user, group, list, options)
chown_R(user, group, list, options)
touch(list, options)

어느 쪽이 좋습니까


답변

다른 사람들이 이미 말했듯이 첫 번째 줄은

#!/usr/bin/env ruby

그리고 당신은 또한 그것을 실행 가능하게 만들어야합니다 : (쉘에서)

chmod +x test.rb

그런 다음 루비 코드를 따릅니다. 파일을 열면

File.open("file", "r") do |io|
    # do something with io
end

파일은 현재 디렉토리에서 열립니다. pwd 쉘에서 .

스크립트 경로도 간단합니다. 함께 $0사용하면 스크립트에 대한 상대 경로입니다 쉘의 첫 번째 인수를 얻을. 절대 경로는 다음과 같이 결정될 수 있습니다.

#!/usr/bin/env ruby
require 'pathname'
p Pathname.new($0).realpath()

파일 시스템 작업의 경우 거의 항상 경로 이름을 사용합니다. 이것은 다른 많은 파일 시스템 관련 클래스의 래퍼입니다. 또한 유용합니다 : Dir, File …


답변

다른 답변에서 누락 된 중요한 사항이 있습니다. 명령 행 매개 변수는 ARGV (전역) 배열을 통해 Ruby 쉘 스크립트에 노출됩니다.

따라서 my_shell_script라는 스크립트가 있다면 :

#!/usr/bin/env ruby
puts "I was passed: "
ARGV.each do |value|
  puts value
end

… 다른 사람들이 언급했듯이 실행 가능하게 만드십시오.

chmod u+x my_shell_script

그리고 그렇게 부르십시오 :

> ./my_shell_script one two three four five

당신은 이것을 얻을 것입니다 :

I was passed:
one
two
three
four
five

인수는 파일 이름 확장과 잘 작동합니다.

./my_shell_script *

I was passed:
a_file_in_the_current_directory
another_file
my_shell_script
the_last_file

이것의 대부분은 UNIX (Linux, Mac OS X)에서만 작동하지만 Windows에서는 비슷한 (편리하지는 않지만) 할 수 있습니다.


답변

여기에는 좋은 조언이 많이 있으므로 조금 더 추가하고 싶었습니다.

  1. 백틱 (또는 백틱)을 사용하면 일부 스크립팅 작업을 훨씬 쉽게 수행 할 수 있습니다. 치다

    puts `find . | grep -i lib`
  2. 백틱의 출력을 얻는 데 문제가 발생하면 표준 아웃 대신 표준 오류가 발생합니다. 이 조언을 사용하십시오

    out = `git status 2>&1`
  3. 백틱은 문자열 보간을 수행합니다.

    blah = 'lib'
    `touch #{blah}`
  4. 루비 내부도 파이프 할 수 있습니다 . 내 블로그에 대한 링크이지만 여기로 다시 연결되므로 괜찮습니다.

  5. 다른 사람들이 지적했듯이, 진지하게하고 싶다면 Rush가 있습니다 : 쉘 교체 (나에게 너무 까다 롭습니다)뿐만 아니라 쉘 스크립트 및 프로그램에서 사용하기위한 라이브러리 이기도 합니다.


Mac의 경우 Ruby에서 Applescript를 사용하여 더 많은 기능을 사용하십시오. 내 shell_here스크립트는 다음과 같습니다 .

#!/usr/bin/env ruby
`env | pbcopy`
cmd =  %Q@tell app "Terminal" to do script "$(paste_env)"@
puts cmd

`osascript -e "${cmd}"`


답변

RubyEveryday Scripting 의 사본을 받으십시오 . 원하는 유형의 작업을 수행하는 방법에 대한 유용한 팁이 많이 있습니다.


답변

도움이 될 수도 있습니다 : http://rush.heroku.com/

많이 사용하지는 않았지만 꽤 멋져 보입니다.

사이트에서 :

rush는 순수 Ruby 구문을 사용하는 유닉스 쉘 (bash, zsh 등)을 대체합니다. 파일을 살펴보고, 프로세스를 찾아서 죽이고, 파일을 복사하십시오-이제는 Ruby에서 쉘에서하는 모든 일


답변

script.rb스크립트 를 작성한다고 가정 해 봅시다 . 놓다:

#!/usr/bin/env ruby

첫 번째 줄로 chmod +x script.rb