source

셸 스크립팅에 루비를 어떻게 사용합니까?

ittop 2023. 6. 1. 22:55
반응형

셸 스크립팅에 루비를 어떻게 사용합니까?

수행할 몇 가지 간단한 셸 스크립팅 작업이 있는 경우

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

표준 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에서도 유사한 작업을 수행할 수 있습니다.

여기에 좋은 조언이 많아서 조금 더 덧붙이고 싶었습니다.

  1. 백택스(또는 백택스)를 사용하면 스크립팅 작업을 훨씬 쉽게 수행할 수 있습니다.고려하다

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

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

    blah = 'lib'
    `touch #{blah}`
    
  4. 루비 안에서도 파이프를 사용할 수 있습니다.제 블로그에 대한 링크입니다만, 여기로 다시 연결되므로 괜찮습니다 :) 아마도 이 주제에 대해 더 발전된 것들이 있을 것입니다.

  5. 다른 사람들이 지적했듯이, 만약 당신이 진지해지고 싶다면 러시가 있습니다: 셸 대체물뿐만 아니라(나에게는 너무 진부한) 셸 스크립트와 프로그램에 사용하기 위한 라이브러리이기도 합니다.


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를 사용한 일상 스크립팅 사본을 가져오십시오.그것은 여러분이 하고 싶은 것들의 종류들을 어떻게 하는지에 대한 많은 유용한 팁들을 가지고 있습니다.

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

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

사이트에서:

rush는 순수한 Ruby 구문을 사용하는 유닉스 셸(bash, zsh 등)을 대체하는 것입니다.파일 검색, 프로세스 찾기 및 종료, 파일 복사 - 셸에서 수행하는 모든 작업, 이제 Ruby에서 수행

당신이 당신의 글을 쓴다고 치자.script.rb대본.배치:

#!/usr/bin/env ruby

번째 ▁a합다▁as니을▁do▁and고▁first하▁line▁the.chmod +x script.rb

더 복잡한 루비 스크립트를 작성하고자 할 때 다음과 같은 도구가 도움이 될 수 있습니다.

예:

  • tor(스크립트 프레임워크)

  • gli(인터페이스와 같은 git)

  • 메타돈(단순 도구 생성용)

그들은 특히 '명령줄 앱'과 같은 자신만의 스크립트를 빠르게 작성할 수 있게 해줍니다.

위의 답변은 흥미롭고 Ruby를 셸 스크립트로 사용할 때 매우 유용합니다.저는 루비를 일상 언어로 사용하지 않고 흐름 제어로만 루비를 사용하고 여전히 bash를 사용하여 작업하는 것을 선호합니다.

일부 도우미 기능을 실행 결과 테스트에 사용할 수 있습니다.

#!/usr/bin/env ruby
module ShellHelper
  def test(command)
    `#{command} 2> /dev/null`
    $?.success?
  end

  def execute(command, raise_on_error = true)
    result = `#{command}`
    raise "execute command failed\n" if (not $?.success?) and raise_on_error
    return $?.success?
  end

  def print_exit(message)
    print "#{message}\n"
    exit
  end

  module_function :execute, :print_exit, :test
end

도우미를 사용하면 루비 스크립트가 bash와 유사할 수 있습니다.

#!/usr/bin/env ruby
require './shell_helper'
include ShellHelper

print_exit "config already exists" if test "ls config"

things.each do |thing|
  next if not test "ls #{thing}/config"
  execute "cp -fr #{thing}/config_template config/#{thing}"
end

"루비를 어떻게 쓰나"는 SO의 범위를 조금 벗어납니다.

그러나 이러한 루비 스크립트를 실행 가능한 스크립트로 전환하려면 다음을 루비 스크립트의 첫 줄로 지정합니다.

#!/path/to/ruby

그런 다음 파일을 실행 파일로 만듭니다.

chmod a+x myscript.rb

그리고 당신은 떠나가세요.

스크립트의 시작 부분에 배치합니다.rb

#!/usr/bin/env ruby

그런 다음 실행 파일로 표시합니다.

chmod +x script.rb

웹매트에 의한 답은 완벽합니다.저는 단지 당신에게 추가 사항을 알려드리고 싶습니다.스크립트의 명령줄 매개 변수를 많이 처리해야 하는 경우 optparse를 사용해야 합니다.그것은 간단하고 당신에게 매우 도움이 됩니다.

루비 단위로, 상수__FILE__실행 중인 스크립트의 경로를 항상 제공합니다.

리눅스의 경우/usr/bin/env너의 친구야:

#! /usr/bin/env ruby
# Extension of this script does not matter as long
# as it is executable (chmod +x)
puts File.expand_path(__FILE__)

윈도우즈에서는 .rb 파일이 루비와 연결되어 있는지 여부에 따라 달라집니다.다음과 같은 경우:

# This script filename must end with .rb
puts File.expand_path(__FILE__)

그렇지 않으면 루비를 명시적으로 호출해야 합니다. 저는 중간 .cmd 파일을 사용합니다.

my_script.dll:

@ruby %~dp0\my_script.rb

my_script.dll:

puts File.expand_path(__FILE__)

언급URL : https://stackoverflow.com/questions/166347/how-do-i-use-ruby-for-shell-scripting

반응형