168

実行したい簡単なシェル スクリプト タスクがいくつかあります。

例: 正規表現に一致するファイルのリストから作業ディレクトリ内のファイルを選択します。

標準の bash と grep を使用してこの種のことを実行できることはわかっていますが、コマンド ライン プログラムやフラグなどのヒープを覚えなくても、Windows や Linux で動作するクイック スクリプトをハックできると便利です。

これを実行しようとしましたが、現在のディレクトリへの参照などの情報をどこで取得する必要があるかについて混乱してしまいました

問題は、Ruby シェル スクリプトを作成するために、Ruby ライブラリのどの部分を知る必要があるかということです。

4

13 に答える 13

150

デフォルトでは、すでに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)

これはかなりいいです

于 2008-10-03T13:30:59.110 に答える
111

他の人がすでに言ったように、最初の行は

#!/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()

ファイル システム操作では、ほとんどの場合パス名を使用します。これは、他の多くのファイル システム関連クラスのラッパーです。また役に立つ: ディレクトリ、ファイル...

于 2008-10-03T11:41:04.480 に答える
68

他の回答には欠けている重要な点があります。コマンド ライン パラメーターは、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 でも同様の (あまり便利ではありませんが) ことができます。

于 2009-11-27T05:52:03.483 に答える
33

ここには良いアドバイスがたくさんあるので、もう少し追加したいと思います。

  1. バックティック (またはバックティック) を使用すると、いくつかのスクリプト作成がはるかに簡単になります。検討

    puts `find . | grep -i lib`
    
  2. バックティックの出力を取得する際に問題が発生した場合、標準出力ではなく標準エラーに出力されます。このアドバイスを使用してください

    out = `git status 2>&1`
    
  3. バックティックは文字列補間を行います:

    blah = 'lib'
    `touch #{blah}`
    
  4. Ruby 内でパイプすることもできます。これは私のブログへのリンクですが、ここに戻ってくるので問題ありません :) このトピックについては、おそらくもっと高度なことが書かれています。

  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}"`
于 2010-03-06T13:29:15.493 に答える
22

Everyday Scripting with Rubyのコピーを入手してください。やりたいことの種類を実行する方法について、役立つヒントがたくさんあります。

于 2008-10-03T12:42:06.650 に答える
12

これも役立つかもしれません: http://rush.heroku.com/

あまり使っていませんが、なかなかいい感じです

サイトから:

rush は、純粋な Ruby 構文を使用する UNIX シェル (bash、zsh など) の代替です。ファイルを grep し、プロセスを見つけて強制終了し、ファイルをコピーする - シェルで行うすべてのことを Ruby で行うようになりました

于 2008-10-05T09:29:29.003 に答える
12

script.rbあなたがスクリプトを書いたとしましょう。置く:

#!/usr/bin/env ruby

最初の行として、chmod +x script.rb

于 2008-10-03T11:14:23.110 に答える
7

より複雑な Ruby スクリプトを作成する場合は、次のツールが役立ちます。

例えば:

  • トール(スクリプト フレームワーク)

  • gli (git ライクなインターフェース)

  • メタドン(簡単なツールの作成用)

これにより、独自のスクリプト、特に「コマンド ライン アプリ」をすばやく書き始めることができます。

于 2013-03-19T07:59:46.080 に答える
5

上記の回答は興味深いもので、Ruby をシェル スクリプトとして使用する場合に非常に役立ちます。私にとって、Ruby を日常の言語として使用することはありません。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

ヘルパーを使用すると、Ruby スクリプトは 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
于 2016-12-01T17:10:47.727 に答える
5

「Ruby の書き方」は、SO の範囲を少し超えています。

しかし、これらの ruby​​ スクリプトを実行可能なスクリプトに変換するには、これを ruby​​ スクリプトの最初の行として置きます。

#!/path/to/ruby

次に、ファイルを実行可能にします。

chmod a+x myscript.rb

そして離れて行きます。

于 2008-10-03T11:07:18.613 に答える
4

これを script.rb の先頭に配置します

#!/usr/bin/env ruby

次に、実行可能としてマークします。

chmod +x script.rb
于 2008-10-03T11:37:45.357 に答える
3

Ruby では、定数__FILE__は実行中のスクリプトのパスを常に提供します。

Linux では、/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__)

Windows では、.rb ファイルが ruby​​ に関連付けられているかどうかによって異なります。それらが次の場合:

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

そうでない場合は、明示的に ruby​​ を呼び出す必要があります。中間の .cmd ファイルを使用します。

my_script.cmd:

@ruby %~dp0\my_script.rb

my_script.rb:

puts File.expand_path(__FILE__)
于 2008-10-03T12:18:29.397 に答える
3

webmatによる回答は完璧です。追加で指摘したいだけです。スクリプトのコマンド ライン パラメータを多く扱う必要がある場合は、optparseを使用する必要があります。シンプルでとても助かります。

于 2012-08-30T18:22:13.897 に答える