summaryrefslogtreecommitdiff
path: root/doc/shell.rd.ja
blob: 073e71ea42d6571bebfa057330d91405ced7c914 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
 -- shell.rb
				$Release Version: 0.6.0 $
			   	$Revision$
			   	$Date$
			   	by Keiju ISHITSUKA(keiju@ishitsuka.com)

=begin

= 目的

ruby上でsh/cshのようにコマンドの実行及びフィルタリングを手軽に行う.
sh/cshの制御文はrubyの機能を用いて実現する.

= 主なクラス一覧

== Shell

Shellオブジェクトはカレントディレクトリを持ち, コマンド実行はそこからの
相対パスになります.

--- Shell#cwd
--- Shell#dir
--- Shell#getwd
--- Shell#pwd

      カレントディレクトリを返す。

--- Shell#system_path

      コマンドサーチパスの配列を返す。

--- Shell#umask

      umaskを返す。

== Filter

コマンドの実行結果はすべてFilterとしてかえります. Enumerableをincludeし
ています.

= 主なメソッド一覧

== コマンド定義

OS上のコマンドを実行するにはまず, Shellのメソッドとして定義します.

注) コマンドを定義しなくとも直接実行できるShell#systemコマンドもあります.

--- Shell.def_system_command(command, path = command)

      Shellのメソッドとしてcommandを登録します. 

      例)
      Shell.def_system_command "ls"
        ls を定義

      Shell.def_system_command "sys_sort", "sort"
        sortコマンドをsys_sortとして定義

--- Shell.undef_system_command(command)

      commandを削除します.

--- Shell.alias_command(ali, command, *opts) {...}

      commandのaliasをします. 

      例)
        Shell.alias_command "lsC", "ls", "-CBF", "--show-control-chars"
        Shell.alias_command("lsC", "ls"){|*opts| ["-CBF", "--show-control-chars", *opts]}

--- Shell.unalias_command(ali)

      commandのaliasを削除します.

--- Shell.install_system_commands(pre = "sys_")

      system_path上にある全ての実行可能ファイルをShellに定義する. メソッ
      ド名は元のファイル名の頭にpreをつけたものとなる.

== 生成

--- Shell.new

      プロセスのカレントディレクトリをカレントディレクトリとするShellオ
      ブジェクトを生成します.

--- Shell.cd(path)

      pathをカレントディレクトリとするShellオブジェクトを生成します.

== プロセス管理

--- Shell#jobs

      スケジューリングされているjobの一覧を返す.

--- Shell#kill sig, job

      jobにシグナルsigを送る

== カレントディレクトリ操作

--- Shell#cd(path, &block)
--- Shell#chdir

      カレントディレクトリをpathにする. イテレータとして呼ばれたときには
      ブロック実行中のみカレントディレクトリを変更する.

--- Shell#pushd(path = nil, &block)
--- Shell#pushdir

      カレントディレクトリをディレクトリスタックにつみ, カレントディレク
      トリをpathにする. pathが省略されたときには, カレントディレクトリと
      ディレクトリスタックのトップを交換する. イテレータとして呼ばれたと
      きには, ブロック実行中のみpushdする.

--- Shell#popd
--- Shell#popdir

      ディレクトリスタックからポップし, それをカレントディレクトリにする.

== ファイル/ディレクトリ操作

--- Shell#foreach(path = nil, &block)

      pathがファイルなら, File#foreach
      pathがディレクトリなら, Dir#foreach

--- Shell#open(path, mode)

      pathがファイルなら, File#open
      pathがディレクトリなら, Dir#open

--- Shell#unlink(path)

      pathがファイルなら, File#unlink
      pathがディレクトリなら, Dir#unlink

--- Shell#test(command, file1, file2)
--- Shell#[command, file1, file2]

      ファイルテスト関数testと同じ. 
      例)
          sh[?e, "foo"]
          sh[:e, "foo"]
          sh["e", "foo"]
          sh[:exists?, "foo"]
          sh["exists?", "foo"]

--- Shell#mkdir(*path)

      Dir.mkdirと同じ(複数可)

--- Shell#rmdir(*path)

      Dir.rmdirと同じ(複数可)

== コマンド実行

--- System#system(command, *opts)

      commandを実行する.
      例)
        print sh.system("ls", "-l")
        sh.system("ls", "-l") | sh.head > STDOUT

--- System#rehash

      リハッシュする

--- Shell#transact &block

      ブロック中ではshellをselfとして実行する.
      例)
        sh.transact{system("ls", "-l") | head > STDOUT}

--- Shell#out(dev = STDOUT, &block)

      transactを呼び出しその結果をdevに出力する.

== 内部コマンド

--- Shell#echo(*strings)
--- Shell#cat(*files)
--- Shell#glob(patten)
--- Shell#tee(file)

      これらは実行すると, それらを内容とするFilterオブジェクトを返します. 

--- Filter#each &block

      フィルタの一行ずつをblockに渡す.

--- Filter#<(src)

      srcをフィルタの入力とする. srcが, 文字列ならばファイルを, IOであれ
      ばそれをそのまま入力とする.

--- Filter#>(to)

      srcをフィルタの出力とする. toが, 文字列ならばファイルに, IOであれ
      ばそれをそのまま出力とする.

--- Filter#>>(to)

      srcをフィルタに追加する. toが, 文字列ならばファイルに, IOであれば
      それをそのまま出力とする.

--- Filter#|(filter)

      パイプ結合

--- Filter#+(filter)

      filter1 + filter2 は filter1の出力の後, filter2の出力を行う.

--- Filter#to_a
--- Filter#to_s

== 組込みコマンド

--- Shell#atime(file)
--- Shell#basename(file, *opt)
--- Shell#chmod(mode, *files)
--- Shell#chown(owner, group, *file)
--- Shell#ctime(file)
--- Shell#delete(*file)
--- Shell#dirname(file)
--- Shell#ftype(file)
--- Shell#join(*file)
--- Shell#link(file_from, file_to)
--- Shell#lstat(file)
--- Shell#mtime(file)
--- Shell#readlink(file)
--- Shell#rename(file_from, file_to)
--- Shell#split(file)
--- Shell#stat(file)
--- Shell#symlink(file_from, file_to)
--- Shell#truncate(file, length)
--- Shell#utime(atime, mtime, *file)

      これらはFileクラスにある同名のクラスメソッドと同じです.

--- Shell#blockdev?(file)
--- Shell#chardev?(file)
--- Shell#directory?(file)
--- Shell#executable?(file)
--- Shell#executable_real?(file)
--- Shell#exist?(file)/Shell#exists?(file)
--- Shell#file?(file)
--- Shell#grpowned?(file)
--- Shell#owned?(file)
--- Shell#pipe?(file)
--- Shell#readable?(file)
--- Shell#readable_real?(file)
--- Shell#setgid?(file)
--- Shell#setuid?(file)
--- Shell#size(file)/Shell#size?(file)
--- Shell#socket?(file)
--- Shell#sticky?(file)
--- Shell#symlink?(file)
--- Shell#writable?(file)
--- Shell#writable_real?(file)
--- Shell#zero?(file)

      これらはFileTestクラスにある同名のクラスメソッドと同じです.

--- Shell#syscopy(filename_from, filename_to)
--- Shell#copy(filename_from, filename_to)
--- Shell#move(filename_from, filename_to)
--- Shell#compare(filename_from, filename_to)
--- Shell#safe_unlink(*filenames)
--- Shell#makedirs(*filenames)
--- Shell#install(filename_from, filename_to, mode)

      これらはFileToolsクラスにある同名のクラスメソッドと同じです.

      その他, 以下のものがエイリアスされています.

--- Shell#cmp	<- Shell#compare
--- Shell#mv	<- Shell#move
--- Shell#cp	<- Shell#copy
--- Shell#rm_f	<- Shell#safe_unlink
--- Shell#mkpath	<- Shell#makedirs

= サンプル

== ex1

  sh = Shell.cd("/tmp")
  sh.mkdir "shell-test-1" unless sh.exists?("shell-test-1")
  sh.cd("shell-test-1")
  for dir in ["dir1", "dir3", "dir5"]
    if !sh.exists?(dir)
      sh.mkdir dir
      sh.cd(dir) do
	f = sh.open("tmpFile", "w")
	f.print "TEST\n"
	f.close
      end
      print sh.pwd
    end
  end

== ex2

  sh = Shell.cd("/tmp")
  sh.transact do
    mkdir "shell-test-1" unless exists?("shell-test-1")
    cd("shell-test-1")
    for dir in ["dir1", "dir3", "dir5"]
      if !exists?(dir)
	mkdir dir
	cd(dir) do
	  f = open("tmpFile", "w")
	  f.print "TEST\n"
	  f.close
	end
	print pwd
      end
    end
  end

== ex3

  sh.cat("/etc/printcap") | sh.tee("tee1") > "tee2"
  (sh.cat < "/etc/printcap") | sh.tee("tee11") > "tee12"
  sh.cat("/etc/printcap") | sh.tee("tee1") >> "tee2"
  (sh.cat < "/etc/printcap") | sh.tee("tee11") >> "tee12"

== ex4

  print sh.cat("/etc/passwd").head.collect{|l| l =~ /keiju/}

=end