Как я использую Ruby для сценариев оболочки?

163
задан ergosys 22 February 2012 в 23:55
поделиться

10 ответов

По умолчанию у Вас уже есть доступ к Dir и Файл , которые довольно полезны собой.

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)

, Который является довольно хорош

146
ответ дан webmat 23 November 2019 в 21:16
поделиться

Пойдите вовлекают себя копия Повседневные Сценарии с Ruby. Это имеет много полезных подсказок относительно того, как сделать, типы вещей Ваш желают сделать.

21
ответ дан Aaron Hinni 23 November 2019 в 21:16
поделиться

Это могло бы также быть полезно: http://rush.heroku.com/

я не использовал его очень, но выглядит довольно прохладным

От сайта:

порыв является заменой для оболочки Unix (удар, zsh, и т.д.), который использует чистый синтаксис Ruby. Grep через файлы, найдите и уничтожьте процессы, скопируйте файлы - все, что Вы делаете в оболочке, теперь в Ruby

12
ответ дан craigp 23 November 2019 в 21:16
поделиться

скажем, Вы пишете Ваш script.rb сценарий. поместите:

#!/usr/bin/env ruby

как первая строка и делают chmod +x script.rb

11
ответ дан VoY 23 November 2019 в 21:16
поделиться

"Как я пишу, что рубин" выходит за рамки немного из ТАК.

, Но превратить эти рубиновые сценарии в исполняемые сценарии, поместите это как первую строку Вашего рубинового сценария:

#!/path/to/ruby

Тогда делают исполняемый файл файла:

chmod a+x myscript.rb

и далеко Вы идете.

4
ответ дан Matthew Scharley 23 November 2019 в 21:16
поделиться

Поместите это в начале Вашего script.rb

#!/usr/bin/env ruby

Тогда отмечает его как исполняемый файл:

chmod +x script.rb
4
ответ дан Daniel Beardsley 23 November 2019 в 21:16
поделиться

В рубине константа __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 файлы с рубином. Если они:

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

, Если они не, необходимо явно вызвать рубин на них, я использую промежуточное звено .cmd файл:

my_script.cmd:

@ruby %~dp0\my_script.rb

my_script.rb:

puts File.expand_path(__FILE__)
3
ответ дан VoY 23 November 2019 в 21:16
поделиться

Как другие уже сказали, Ваша первая строка должна быть

#!/usr/bin/env ruby

И также необходимо сделать это исполняемым файлом: (в оболочке)

chmod +x test.rb

Затем следует коду Ruby. Если Вы открываете файл

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, Файл...

109
ответ дан Georg Schölly 23 November 2019 в 21:16
поделиться

Вот кое-что важное, чего не хватает в других ответах: параметры командной строки доступны вашему сценарию оболочки Ruby через массив ARGV (глобальный).

Итак, если у вас был сценарий называется 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.

66
ответ дан 23 November 2019 в 21:16
поделиться

Здесь много хороших советов, поэтому я хотел добавить еще немного.

  1. Backticks (или back-ticks) позволяет вам делать некоторые скриптовые вещи намного проще. Рассмотрим

    puts `find . | grep -i lib`
    
  2. Если у вас возникли проблемы с получением вывода backticks, значит, материал отправляется в standard err вместо standard out. Воспользуйтесь этим советом

    out = `git status 2>&1`
    
  3. Backticks делает интерполяцию строк:

    blah = 'lib'
    `touch #{blah}`
    
  4. Вы можете использовать трубы и внутри Ruby. Это ссылка на мой блог, но она ссылается сюда, так что все в порядке :) Возможно, там есть более продвинутые вещи на эту тему.

  5. Как отметили другие люди, если вы хотите серьезно заняться, есть Rush: не только как замена оболочки (что для меня слишком заумно), но и как библиотека для использования в сценариях и программах оболочки.


На Mac используйте Applescript внутри Ruby для большей мощности. Вот мой shell_here скрипт:

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

`osascript -e "${cmd}"`
32
ответ дан 23 November 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: