내가하고 싶은 간단한 쉘 스크립팅 작업이 있습니다.
예를 들면 다음과 같습니다. 일부 정규식과 일치하는 파일 목록에서 작업 디렉토리의 파일을 선택합니다.
나는 표준 bash와 grep을 사용하여 이런 종류의 일을 할 수 있다는 것을 알고 있지만 명령 줄 프로그램과 플래그 등을 기억하지 않고도 Windows와 Linux에서 작동하는 빠른 스크립트를 해킹 할 수 있다는 것이 좋을 것입니다.
나는이 일을하려고했지만 현재 디렉토리에 대한 참조와 같은 정보를 어디에서 얻을 수 있는지 혼란스러워졌습니다.
질문은 루비 쉘 스크립트를 작성하기 위해 루비 라이브러리의 어떤 부분을 알아야합니까?
답변
기본적으로 이미 Dir 및 File에 액세스 할 수 있으며 이는 매우 유용합니다.
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에서는 비슷한 (편리하지는 않지만) 할 수 있습니다.
답변
여기에는 좋은 조언이 많이 있으므로 조금 더 추가하고 싶었습니다.
-
백틱 (또는 백틱)을 사용하면 일부 스크립팅 작업을 훨씬 쉽게 수행 할 수 있습니다. 치다
puts `find . | grep -i lib`
-
백틱의 출력을 얻는 데 문제가 발생하면 표준 아웃 대신 표준 오류가 발생합니다. 이 조언을 사용하십시오
out = `git status 2>&1`
-
백틱은 문자열 보간을 수행합니다.
blah = 'lib' `touch #{blah}`
-
루비 내부도 파이프 할 수 있습니다 . 내 블로그에 대한 링크이지만 여기로 다시 연결되므로 괜찮습니다.
-
다른 사람들이 지적했듯이, 진지하게하고 싶다면 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}"`
답변
Ruby 로 Everyday Scripting 의 사본을 받으십시오 . 원하는 유형의 작업을 수행하는 방법에 대한 유용한 팁이 많이 있습니다.
답변
도움이 될 수도 있습니다 : http://rush.heroku.com/
많이 사용하지는 않았지만 꽤 멋져 보입니다.
사이트에서 :
rush는 순수 Ruby 구문을 사용하는 유닉스 쉘 (bash, zsh 등)을 대체합니다. 파일을 살펴보고, 프로세스를 찾아서 죽이고, 파일을 복사하십시오-이제는 Ruby에서 쉘에서하는 모든 일
답변
script.rb
스크립트 를 작성한다고 가정 해 봅시다 . 놓다:
#!/usr/bin/env ruby
첫 번째 줄로 chmod +x script.rb