rbs 3.3.2 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +2 -5
- data/.github/workflows/ruby.yml +7 -8
- data/.github/workflows/typecheck.yml +37 -0
- data/CHANGELOG.md +65 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +11 -11
- data/README.md +1 -0
- data/Rakefile +2 -2
- data/Steepfile +2 -2
- data/core/array.rbs +19 -49
- data/core/basic_object.rbs +2 -2
- data/core/comparable.rbs +17 -8
- data/core/complex.rbs +82 -43
- data/core/data.rbs +2 -4
- data/core/dir.rbs +635 -295
- data/core/enumerable.rbs +11 -18
- data/core/enumerator.rbs +37 -31
- data/core/errors.rbs +4 -0
- data/core/false_class.rbs +34 -15
- data/core/fiber.rbs +23 -0
- data/core/file.rbs +329 -120
- data/core/float.rbs +17 -32
- data/core/gc.rbs +17 -11
- data/core/hash.rbs +22 -44
- data/core/integer.rbs +82 -113
- data/core/io/buffer.rbs +90 -47
- data/core/io.rbs +54 -121
- data/core/kernel.rbs +442 -489
- data/core/match_data.rbs +55 -56
- data/core/module.rbs +45 -1
- data/core/nil_class.rbs +98 -35
- data/core/numeric.rbs +22 -32
- data/core/object_space/weak_key_map.rbs +102 -0
- data/core/process.rbs +1242 -655
- data/core/ractor.rbs +139 -120
- data/core/range.rbs +100 -4
- data/core/rational.rbs +0 -4
- data/core/rbs/unnamed/argf.rbs +16 -8
- data/core/rbs/unnamed/env_class.rbs +0 -24
- data/core/refinement.rbs +8 -0
- data/core/regexp.rbs +1149 -598
- data/core/ruby_vm.rbs +126 -12
- data/core/rubygems/platform.rbs +9 -0
- data/core/rubygems/rubygems.rbs +1 -1
- data/core/rubygems/version.rbs +5 -1
- data/core/set.rbs +20 -22
- data/core/signal.rbs +4 -4
- data/core/string.rbs +283 -230
- data/core/string_io.rbs +2 -14
- data/core/struct.rbs +404 -24
- data/core/symbol.rbs +1 -19
- data/core/thread.rbs +29 -12
- data/core/time.rbs +227 -104
- data/core/trace_point.rbs +2 -5
- data/core/true_class.rbs +54 -21
- data/core/warning.rbs +14 -11
- data/docs/data_and_struct.md +29 -0
- data/docs/gem.md +58 -0
- data/docs/syntax.md +3 -5
- data/docs/tools.md +1 -0
- data/ext/rbs_extension/lexer.c +643 -559
- data/ext/rbs_extension/lexer.re +5 -1
- data/ext/rbs_extension/parser.c +12 -3
- data/ext/rbs_extension/unescape.c +7 -47
- data/lib/rbs/cli/diff.rb +4 -1
- data/lib/rbs/cli/validate.rb +280 -0
- data/lib/rbs/cli.rb +2 -194
- data/lib/rbs/collection/config.rb +5 -6
- data/lib/rbs/collection/sources/git.rb +1 -1
- data/lib/rbs/collection.rb +1 -0
- data/lib/rbs/diff.rb +7 -4
- data/lib/rbs/errors.rb +11 -0
- data/lib/rbs/test/errors.rb +10 -2
- data/lib/rbs/test/guaranteed.rb +2 -3
- data/lib/rbs/test/type_check.rb +15 -10
- data/lib/rbs/test.rb +3 -3
- data/lib/rbs/types.rb +29 -0
- data/lib/rbs/unit_test/convertibles.rb +176 -0
- data/lib/rbs/unit_test/spy.rb +136 -0
- data/lib/rbs/unit_test/type_assertions.rb +341 -0
- data/lib/rbs/unit_test/with_aliases.rb +143 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/version.rb +1 -1
- data/sig/cli/validate.rbs +43 -0
- data/sig/diff.rbs +3 -1
- data/sig/errors.rbs +8 -0
- data/sig/rbs.rbs +1 -1
- data/sig/test/errors.rbs +52 -0
- data/sig/test/guranteed.rbs +9 -0
- data/sig/test/type_check.rbs +19 -0
- data/sig/test.rbs +82 -0
- data/sig/types.rbs +6 -1
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +28 -0
- data/sig/unit_test/type_assertions.rbs +194 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/stdlib/base64/0/base64.rbs +307 -45
- data/stdlib/bigdecimal/0/big_decimal.rbs +35 -15
- data/stdlib/coverage/0/coverage.rbs +2 -2
- data/stdlib/csv/0/csv.rbs +25 -55
- data/stdlib/date/0/date.rbs +1 -43
- data/stdlib/date/0/date_time.rbs +1 -13
- data/stdlib/delegate/0/delegator.rbs +186 -0
- data/stdlib/delegate/0/kernel.rbs +47 -0
- data/stdlib/delegate/0/simple_delegator.rbs +98 -0
- data/stdlib/did_you_mean/0/did_you_mean.rbs +1 -1
- data/stdlib/erb/0/erb.rbs +2 -2
- data/stdlib/fileutils/0/fileutils.rbs +0 -19
- data/stdlib/io-console/0/io-console.rbs +12 -1
- data/stdlib/ipaddr/0/ipaddr.rbs +2 -1
- data/stdlib/json/0/json.rbs +320 -81
- data/stdlib/logger/0/logger.rbs +9 -5
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +6 -6
- data/stdlib/monitor/0/monitor.rbs +78 -0
- data/stdlib/net-http/0/net-http.rbs +1880 -543
- data/stdlib/objspace/0/objspace.rbs +19 -13
- data/stdlib/openssl/0/openssl.rbs +508 -127
- data/stdlib/optparse/0/optparse.rbs +25 -11
- data/stdlib/pathname/0/pathname.rbs +1 -1
- data/stdlib/pp/0/pp.rbs +2 -5
- data/stdlib/prettyprint/0/prettyprint.rbs +2 -2
- data/stdlib/pstore/0/pstore.rbs +2 -4
- data/stdlib/rdoc/0/comment.rbs +1 -2
- data/stdlib/resolv/0/resolv.rbs +4 -2
- data/stdlib/socket/0/socket.rbs +2 -2
- data/stdlib/socket/0/unix_socket.rbs +2 -2
- data/stdlib/strscan/0/string_scanner.rbs +3 -2
- data/stdlib/tempfile/0/tempfile.rbs +1 -1
- data/stdlib/uri/0/common.rbs +245 -123
- metadata +24 -4
- data/lib/rbs/test/spy.rb +0 -6
data/core/kernel.rbs
CHANGED
|
@@ -362,25 +362,63 @@ module Kernel : BasicObject
|
|
|
362
362
|
|
|
363
363
|
# <!--
|
|
364
364
|
# rdoc-file=process.c
|
|
365
|
-
# -
|
|
366
|
-
# - Process.fork
|
|
365
|
+
# - Process.fork { ... } -> integer or nil
|
|
366
|
+
# - Process.fork -> integer or nil
|
|
367
367
|
# -->
|
|
368
|
-
# Creates a
|
|
369
|
-
# subprocess, and the subprocess terminates with a status of zero. Otherwise,
|
|
370
|
-
# the `fork` call returns twice, once in the parent, returning the process ID of
|
|
371
|
-
# the child, and once in the child, returning *nil*. The child process can exit
|
|
372
|
-
# using Kernel.exit! to avoid running any `at_exit` functions. The parent
|
|
373
|
-
# process should use Process.wait to collect the termination statuses of its
|
|
374
|
-
# children or use Process.detach to register disinterest in their status;
|
|
375
|
-
# otherwise, the operating system may accumulate zombie processes.
|
|
368
|
+
# Creates a child process.
|
|
376
369
|
#
|
|
377
|
-
#
|
|
378
|
-
#
|
|
370
|
+
# With a block given, runs the block in the child process; on block exit, the
|
|
371
|
+
# child terminates with a status of zero:
|
|
379
372
|
#
|
|
380
|
-
#
|
|
373
|
+
# puts "Before the fork: #{Process.pid}"
|
|
374
|
+
# fork do
|
|
375
|
+
# puts "In the child process: #{Process.pid}"
|
|
376
|
+
# end # => 382141
|
|
377
|
+
# puts "After the fork: #{Process.pid}"
|
|
381
378
|
#
|
|
382
|
-
#
|
|
383
|
-
#
|
|
379
|
+
# Output:
|
|
380
|
+
#
|
|
381
|
+
# Before the fork: 420496
|
|
382
|
+
# After the fork: 420496
|
|
383
|
+
# In the child process: 420520
|
|
384
|
+
#
|
|
385
|
+
# With no block given, the `fork` call returns twice:
|
|
386
|
+
#
|
|
387
|
+
# * Once in the parent process, returning the pid of the child process.
|
|
388
|
+
# * Once in the child process, returning `nil`.
|
|
389
|
+
#
|
|
390
|
+
#
|
|
391
|
+
# Example:
|
|
392
|
+
#
|
|
393
|
+
# puts "This is the first line before the fork (pid #{Process.pid})"
|
|
394
|
+
# puts fork
|
|
395
|
+
# puts "This is the second line after the fork (pid #{Process.pid})"
|
|
396
|
+
#
|
|
397
|
+
# Output:
|
|
398
|
+
#
|
|
399
|
+
# This is the first line before the fork (pid 420199)
|
|
400
|
+
# 420223
|
|
401
|
+
# This is the second line after the fork (pid 420199)
|
|
402
|
+
#
|
|
403
|
+
# This is the second line after the fork (pid 420223)
|
|
404
|
+
#
|
|
405
|
+
# In either case, the child process may exit using Kernel.exit! to avoid the
|
|
406
|
+
# call to Kernel#at_exit.
|
|
407
|
+
#
|
|
408
|
+
# To avoid zombie processes, the parent process should call either:
|
|
409
|
+
#
|
|
410
|
+
# * Process.wait, to collect the termination statuses of its children.
|
|
411
|
+
# * Process.detach, to register disinterest in their status.
|
|
412
|
+
#
|
|
413
|
+
#
|
|
414
|
+
# The thread calling `fork` is the only thread in the created child process;
|
|
415
|
+
# `fork` doesn't copy other threads.
|
|
416
|
+
#
|
|
417
|
+
# Note that method `fork` is available on some platforms, but not on others:
|
|
418
|
+
#
|
|
419
|
+
# Process.respond_to?(:fork) # => true # Would be false on some.
|
|
420
|
+
#
|
|
421
|
+
# If not, you may use ::spawn instead of `fork`.
|
|
384
422
|
#
|
|
385
423
|
def self?.fork: () -> Integer?
|
|
386
424
|
| () { () -> void } -> Integer
|
|
@@ -407,39 +445,53 @@ module Kernel : BasicObject
|
|
|
407
445
|
|
|
408
446
|
# <!--
|
|
409
447
|
# rdoc-file=complex.c
|
|
410
|
-
# - Complex(
|
|
448
|
+
# - Complex(abs, arg = 0, exception: true) -> complex or nil
|
|
449
|
+
# - Complex(s, exception: true) -> complex or nil
|
|
411
450
|
# -->
|
|
412
|
-
# Returns
|
|
451
|
+
# Returns a new Complex object if the arguments are valid; otherwise raises an
|
|
452
|
+
# exception if `exception` is `true`; otherwise returns `nil`.
|
|
413
453
|
#
|
|
414
|
-
#
|
|
415
|
-
#
|
|
416
|
-
# Complex(nil) #=> TypeError
|
|
417
|
-
# Complex(1, nil) #=> TypeError
|
|
454
|
+
# With Numeric argument `abs`, returns `Complex.rect(abs, arg)` if the arguments
|
|
455
|
+
# are valid.
|
|
418
456
|
#
|
|
419
|
-
#
|
|
420
|
-
#
|
|
457
|
+
# With string argument `s`, returns a new Complex object if the argument is
|
|
458
|
+
# valid; the string may have:
|
|
421
459
|
#
|
|
422
|
-
#
|
|
460
|
+
# * One or two numeric substrings, each of which specifies a Complex, Float,
|
|
461
|
+
# Integer, Numeric, or Rational value, specifying [rectangular
|
|
462
|
+
# coordinates](rdoc-ref:Complex@Rectangular+Coordinates):
|
|
423
463
|
#
|
|
424
|
-
#
|
|
425
|
-
#
|
|
426
|
-
#
|
|
427
|
-
#
|
|
428
|
-
#
|
|
429
|
-
#
|
|
430
|
-
#
|
|
431
|
-
#
|
|
432
|
-
#
|
|
433
|
-
#
|
|
434
|
-
#
|
|
435
|
-
#
|
|
436
|
-
#
|
|
437
|
-
#
|
|
438
|
-
#
|
|
439
|
-
#
|
|
440
|
-
# extra spaces = ? \s* ? ;
|
|
464
|
+
# * Sign-separated real and imaginary numeric substrings (with trailing
|
|
465
|
+
# character `'i'`):
|
|
466
|
+
#
|
|
467
|
+
# Complex('1+2i') # => (1+2i)
|
|
468
|
+
# Complex('+1+2i') # => (1+2i)
|
|
469
|
+
# Complex('+1-2i') # => (1-2i)
|
|
470
|
+
# Complex('-1+2i') # => (-1+2i)
|
|
471
|
+
# Complex('-1-2i') # => (-1-2i)
|
|
472
|
+
#
|
|
473
|
+
# * Real-only numeric string (without trailing character `'i'`):
|
|
474
|
+
#
|
|
475
|
+
# Complex('1') # => (1+0i)
|
|
476
|
+
# Complex('+1') # => (1+0i)
|
|
477
|
+
# Complex('-1') # => (-1+0i)
|
|
478
|
+
#
|
|
479
|
+
# * Imaginary-only numeric string (with trailing character `'i'`):
|
|
441
480
|
#
|
|
442
|
-
#
|
|
481
|
+
# Complex('1i') # => (0+1i)
|
|
482
|
+
# Complex('+1i') # => (0+1i)
|
|
483
|
+
# Complex('-1i') # => (0-1i)
|
|
484
|
+
#
|
|
485
|
+
#
|
|
486
|
+
# * At-sign separated real and imaginary rational substrings, each of which
|
|
487
|
+
# specifies a Rational value, specifying [polar
|
|
488
|
+
# coordinates](rdoc-ref:Complex@Polar+Coordinates):
|
|
489
|
+
#
|
|
490
|
+
# Complex('1/2@3/4') # => (0.36584443443691045+0.34081938001166706i)
|
|
491
|
+
# Complex('+1/2@+3/4') # => (0.36584443443691045+0.34081938001166706i)
|
|
492
|
+
# Complex('+1/2@-3/4') # => (0.36584443443691045-0.34081938001166706i)
|
|
493
|
+
# Complex('-1/2@+3/4') # => (-0.36584443443691045-0.34081938001166706i)
|
|
494
|
+
# Complex('-1/2@-3/4') # => (-0.36584443443691045+0.34081938001166706i)
|
|
443
495
|
#
|
|
444
496
|
def self?.Complex: (_ToC complex_like, ?exception: true) -> Complex
|
|
445
497
|
| (_ToC complex_like, exception: bool) -> Complex?
|
|
@@ -493,7 +545,7 @@ module Kernel : BasicObject
|
|
|
493
545
|
| [K, V] (hash[K, V] hash_like) -> Hash[K, V]
|
|
494
546
|
|
|
495
547
|
# <!--
|
|
496
|
-
# rdoc-file=
|
|
548
|
+
# rdoc-file=kernel.rb
|
|
497
549
|
# - Integer(object, base = 0, exception: true) -> integer or nil
|
|
498
550
|
# -->
|
|
499
551
|
# Returns an integer converted from `object`.
|
|
@@ -511,7 +563,7 @@ module Kernel : BasicObject
|
|
|
511
563
|
# Integer(-1) # => -1
|
|
512
564
|
#
|
|
513
565
|
# With floating-point argument `object` given, returns `object` truncated to an
|
|
514
|
-
#
|
|
566
|
+
# integer:
|
|
515
567
|
#
|
|
516
568
|
# Integer(1.9) # => 1 # Rounds toward zero.
|
|
517
569
|
# Integer(-1.9) # => -1 # Rounds toward zero.
|
|
@@ -700,11 +752,13 @@ module Kernel : BasicObject
|
|
|
700
752
|
# <!--
|
|
701
753
|
# rdoc-file=process.c
|
|
702
754
|
# - abort
|
|
703
|
-
# -
|
|
704
|
-
# - Process.abort([msg])
|
|
755
|
+
# - Process.abort(msg = nil)
|
|
705
756
|
# -->
|
|
706
|
-
#
|
|
707
|
-
#
|
|
757
|
+
# Terminates execution immediately, effectively by calling `Kernel.exit(false)`.
|
|
758
|
+
#
|
|
759
|
+
# If string argument `msg` is given, it is written to STDERR prior to
|
|
760
|
+
# termination; otherwise, if an exception was raised, prints its message and
|
|
761
|
+
# backtrace.
|
|
708
762
|
#
|
|
709
763
|
def self?.abort: (?string msg) -> bot
|
|
710
764
|
|
|
@@ -759,68 +813,102 @@ module Kernel : BasicObject
|
|
|
759
813
|
# rdoc-file=proc.c
|
|
760
814
|
# - binding -> a_binding
|
|
761
815
|
# -->
|
|
762
|
-
# Returns a
|
|
763
|
-
# point of call. This object can be used when calling
|
|
764
|
-
# evaluated command in this environment
|
|
765
|
-
#
|
|
816
|
+
# Returns a Binding object, describing the variable and method bindings at the
|
|
817
|
+
# point of call. This object can be used when calling Binding#eval to execute
|
|
818
|
+
# the evaluated command in this environment, or extracting its local variables.
|
|
819
|
+
#
|
|
820
|
+
# class User
|
|
821
|
+
# def initialize(name, position)
|
|
822
|
+
# @name = name
|
|
823
|
+
# @position = position
|
|
824
|
+
# end
|
|
825
|
+
#
|
|
826
|
+
# def get_binding
|
|
827
|
+
# binding
|
|
828
|
+
# end
|
|
829
|
+
# end
|
|
766
830
|
#
|
|
767
|
-
#
|
|
768
|
-
#
|
|
831
|
+
# user = User.new('Joan', 'manager')
|
|
832
|
+
# template = '{name: @name, position: @position}'
|
|
833
|
+
#
|
|
834
|
+
# # evaluate template in context of the object
|
|
835
|
+
# eval(template, user.get_binding)
|
|
836
|
+
# #=> {:name=>"Joan", :position=>"manager"}
|
|
837
|
+
#
|
|
838
|
+
# Binding#local_variable_get can be used to access the variables whose names are
|
|
839
|
+
# reserved Ruby keywords:
|
|
840
|
+
#
|
|
841
|
+
# # This is valid parameter declaration, but `if` parameter can't
|
|
842
|
+
# # be accessed by name, because it is a reserved word.
|
|
843
|
+
# def validate(field, validation, if: nil)
|
|
844
|
+
# condition = binding.local_variable_get('if')
|
|
845
|
+
# return unless condition
|
|
846
|
+
#
|
|
847
|
+
# # ...Some implementation ...
|
|
769
848
|
# end
|
|
770
|
-
#
|
|
771
|
-
#
|
|
849
|
+
#
|
|
850
|
+
# validate(:name, :empty?, if: false) # skips validation
|
|
851
|
+
# validate(:name, :empty?, if: true) # performs validation
|
|
772
852
|
#
|
|
773
853
|
def self?.binding: () -> Binding
|
|
774
854
|
|
|
775
855
|
# <!--
|
|
776
856
|
# rdoc-file=process.c
|
|
777
|
-
# - exit(status=true)
|
|
778
|
-
# -
|
|
779
|
-
# - Process::exit(status=true)
|
|
857
|
+
# - exit(status = true)
|
|
858
|
+
# - Process.exit(status = true)
|
|
780
859
|
# -->
|
|
781
|
-
# Initiates
|
|
782
|
-
#
|
|
783
|
-
#
|
|
784
|
-
#
|
|
785
|
-
#
|
|
860
|
+
# Initiates termination of the Ruby script by raising SystemExit; the exception
|
|
861
|
+
# may be caught. Returns exit status `status` to the underlying operating
|
|
862
|
+
# system.
|
|
863
|
+
#
|
|
864
|
+
# Values `true` and `false` for argument `status` indicate, respectively,
|
|
865
|
+
# success and failure; The meanings of integer values are system-dependent.
|
|
866
|
+
#
|
|
867
|
+
# Example:
|
|
786
868
|
#
|
|
787
869
|
# begin
|
|
788
870
|
# exit
|
|
789
|
-
# puts
|
|
871
|
+
# puts 'Never get here.'
|
|
790
872
|
# rescue SystemExit
|
|
791
|
-
# puts
|
|
873
|
+
# puts 'Rescued a SystemExit exception.'
|
|
792
874
|
# end
|
|
793
|
-
# puts
|
|
875
|
+
# puts 'After begin block.'
|
|
794
876
|
#
|
|
795
|
-
#
|
|
877
|
+
# Output:
|
|
796
878
|
#
|
|
797
|
-
#
|
|
798
|
-
#
|
|
879
|
+
# Rescued a SystemExit exception.
|
|
880
|
+
# After begin block.
|
|
799
881
|
#
|
|
800
|
-
# Just prior to termination, Ruby executes any
|
|
801
|
-
# Kernel::at_exit) and
|
|
882
|
+
# Just prior to final termination, Ruby executes any at-exit procedures (see
|
|
883
|
+
# Kernel::at_exit) and any object finalizers (see
|
|
802
884
|
# ObjectSpace::define_finalizer).
|
|
803
885
|
#
|
|
804
|
-
#
|
|
805
|
-
#
|
|
886
|
+
# Example:
|
|
887
|
+
#
|
|
888
|
+
# at_exit { puts 'In at_exit function.' }
|
|
889
|
+
# ObjectSpace.define_finalizer('string', proc { puts 'In finalizer.' })
|
|
806
890
|
# exit
|
|
807
891
|
#
|
|
808
|
-
#
|
|
892
|
+
# Output:
|
|
809
893
|
#
|
|
810
|
-
# at_exit function
|
|
811
|
-
#
|
|
894
|
+
# In at_exit function.
|
|
895
|
+
# In finalizer.
|
|
812
896
|
#
|
|
813
897
|
def self?.exit: (?int | bool status) -> bot
|
|
814
898
|
|
|
815
899
|
# <!--
|
|
816
900
|
# rdoc-file=process.c
|
|
817
|
-
# -
|
|
901
|
+
# - exit!(status = false)
|
|
902
|
+
# - Process.exit!(status = false)
|
|
818
903
|
# -->
|
|
819
|
-
# Exits the process immediately
|
|
820
|
-
# to the underlying system
|
|
904
|
+
# Exits the process immediately; no exit handlers are called. Returns exit
|
|
905
|
+
# status `status` to the underlying operating system.
|
|
821
906
|
#
|
|
822
907
|
# Process.exit!(true)
|
|
823
908
|
#
|
|
909
|
+
# Values `true` and `false` for argument `status` indicate, respectively,
|
|
910
|
+
# success and failure; The meanings of integer values are system-dependent.
|
|
911
|
+
#
|
|
824
912
|
def self?.exit!: (?int | bool status) -> bot
|
|
825
913
|
|
|
826
914
|
# <!-- rdoc-file=eval.c -->
|
|
@@ -882,8 +970,6 @@ module Kernel : BasicObject
|
|
|
882
970
|
# For details on `format_string`, see [Format
|
|
883
971
|
# Specifications](rdoc-ref:format_specifications.rdoc).
|
|
884
972
|
#
|
|
885
|
-
# Kernel#format is an alias for Kernel#sprintf.
|
|
886
|
-
#
|
|
887
973
|
def self?.format: (String format, *untyped args) -> String
|
|
888
974
|
|
|
889
975
|
# <!--
|
|
@@ -895,8 +981,6 @@ module Kernel : BasicObject
|
|
|
895
981
|
# For details on `format_string`, see [Format
|
|
896
982
|
# Specifications](rdoc-ref:format_specifications.rdoc).
|
|
897
983
|
#
|
|
898
|
-
# Kernel#format is an alias for Kernel#sprintf.
|
|
899
|
-
#
|
|
900
984
|
alias sprintf format
|
|
901
985
|
|
|
902
986
|
alias self.sprintf self.format
|
|
@@ -947,7 +1031,7 @@ module Kernel : BasicObject
|
|
|
947
1031
|
|
|
948
1032
|
# <!--
|
|
949
1033
|
# rdoc-file=load.c
|
|
950
|
-
# - load(
|
|
1034
|
+
# - load(filename, wrap=false) -> true
|
|
951
1035
|
# -->
|
|
952
1036
|
# Loads and executes the Ruby program in the file *filename*.
|
|
953
1037
|
#
|
|
@@ -975,7 +1059,7 @@ module Kernel : BasicObject
|
|
|
975
1059
|
def self?.load: (String filename, ?Module | bool) -> bool
|
|
976
1060
|
|
|
977
1061
|
# <!--
|
|
978
|
-
# rdoc-file=
|
|
1062
|
+
# rdoc-file=kernel.rb
|
|
979
1063
|
# - loop { block }
|
|
980
1064
|
# - loop -> an_enumerator
|
|
981
1065
|
# -->
|
|
@@ -1011,21 +1095,10 @@ module Kernel : BasicObject
|
|
|
1011
1095
|
# - open(path, mode = 'r', perm = 0666, **opts) -> io or nil
|
|
1012
1096
|
# - open(path, mode = 'r', perm = 0666, **opts) {|io| ... } -> obj
|
|
1013
1097
|
# -->
|
|
1014
|
-
# Creates an IO object connected to the given
|
|
1015
|
-
#
|
|
1016
|
-
# Required string argument `path` determines which of the following occurs:
|
|
1017
|
-
#
|
|
1018
|
-
# * The file at the specified `path` is opened.
|
|
1019
|
-
# * The process forks.
|
|
1020
|
-
# * A subprocess is created.
|
|
1021
|
-
#
|
|
1098
|
+
# Creates an IO object connected to the given file.
|
|
1022
1099
|
#
|
|
1023
|
-
#
|
|
1024
|
-
#
|
|
1025
|
-
# **File Opened**
|
|
1026
|
-
#
|
|
1027
|
-
# If `path` does *not* start with a pipe character (`'|'`), a file stream is
|
|
1028
|
-
# opened with `File.open(path, mode, perm, **opts)`.
|
|
1100
|
+
# This method has potential security vulnerabilities if called with untrusted
|
|
1101
|
+
# input; see [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
1029
1102
|
#
|
|
1030
1103
|
# With no block given, file stream is returned:
|
|
1031
1104
|
#
|
|
@@ -1042,66 +1115,6 @@ module Kernel : BasicObject
|
|
|
1042
1115
|
#
|
|
1043
1116
|
# See File.open for details.
|
|
1044
1117
|
#
|
|
1045
|
-
# **Process Forked**
|
|
1046
|
-
#
|
|
1047
|
-
# If `path` is the 2-character string `'|-'`, the process forks and the child
|
|
1048
|
-
# process is connected to the parent.
|
|
1049
|
-
#
|
|
1050
|
-
# With no block given:
|
|
1051
|
-
#
|
|
1052
|
-
# io = open('|-')
|
|
1053
|
-
# if io
|
|
1054
|
-
# $stderr.puts "In parent, child pid is #{io.pid}."
|
|
1055
|
-
# else
|
|
1056
|
-
# $stderr.puts "In child, pid is #{$$}."
|
|
1057
|
-
# end
|
|
1058
|
-
#
|
|
1059
|
-
# Output:
|
|
1060
|
-
#
|
|
1061
|
-
# In parent, child pid is 27903.
|
|
1062
|
-
# In child, pid is 27903.
|
|
1063
|
-
#
|
|
1064
|
-
# With a block given:
|
|
1065
|
-
#
|
|
1066
|
-
# open('|-') do |io|
|
|
1067
|
-
# if io
|
|
1068
|
-
# $stderr.puts "In parent, child pid is #{io.pid}."
|
|
1069
|
-
# else
|
|
1070
|
-
# $stderr.puts "In child, pid is #{$$}."
|
|
1071
|
-
# end
|
|
1072
|
-
# end
|
|
1073
|
-
#
|
|
1074
|
-
# Output:
|
|
1075
|
-
#
|
|
1076
|
-
# In parent, child pid is 28427.
|
|
1077
|
-
# In child, pid is 28427.
|
|
1078
|
-
#
|
|
1079
|
-
# **Subprocess Created**
|
|
1080
|
-
#
|
|
1081
|
-
# If `path` is `'|command'` (`'command' != '-'`), a new subprocess runs the
|
|
1082
|
-
# command; its open stream is returned. Note that the command may be processed
|
|
1083
|
-
# by shell if it contains shell metacharacters.
|
|
1084
|
-
#
|
|
1085
|
-
# With no block given:
|
|
1086
|
-
#
|
|
1087
|
-
# io = open('|echo "Hi!"') # => #<IO:fd 12>
|
|
1088
|
-
# print io.gets
|
|
1089
|
-
# io.close
|
|
1090
|
-
#
|
|
1091
|
-
# Output:
|
|
1092
|
-
#
|
|
1093
|
-
# "Hi!"
|
|
1094
|
-
#
|
|
1095
|
-
# With a block given, calls the block with the stream, then closes the stream:
|
|
1096
|
-
#
|
|
1097
|
-
# open('|echo "Hi!"') do |io|
|
|
1098
|
-
# print io.gets
|
|
1099
|
-
# end
|
|
1100
|
-
#
|
|
1101
|
-
# Output:
|
|
1102
|
-
#
|
|
1103
|
-
# "Hi!"
|
|
1104
|
-
#
|
|
1105
1118
|
def self?.open: (String name, ?String mode, ?Integer perm) -> IO?
|
|
1106
1119
|
| [T] (String name, ?String mode, ?Integer perm) { (IO) -> T } -> T
|
|
1107
1120
|
|
|
@@ -1255,6 +1268,10 @@ module Kernel : BasicObject
|
|
|
1255
1268
|
# 0..4
|
|
1256
1269
|
# [0..4, 0..4, 0..4]
|
|
1257
1270
|
#
|
|
1271
|
+
# Kernel#p is designed for debugging purposes. Ruby implementations may define
|
|
1272
|
+
# Kernel#p to be uninterruptible in whole or in part. On CRuby, Kernel#p's
|
|
1273
|
+
# writing of data is uninterruptible.
|
|
1274
|
+
#
|
|
1258
1275
|
def self?.p: [T < _Inspect] (T arg0) -> T
|
|
1259
1276
|
| (_Inspect arg0, _Inspect arg1, *_Inspect rest) -> Array[_Inspect]
|
|
1260
1277
|
| () -> nil
|
|
@@ -1399,7 +1416,7 @@ module Kernel : BasicObject
|
|
|
1399
1416
|
|
|
1400
1417
|
# <!--
|
|
1401
1418
|
# rdoc-file=load.c
|
|
1402
|
-
# - require_relative(
|
|
1419
|
+
# - require_relative(string) -> true or false
|
|
1403
1420
|
# -->
|
|
1404
1421
|
# Ruby tries to load the library named *string* relative to the directory
|
|
1405
1422
|
# containing the requiring file. If the file does not exist a LoadError is
|
|
@@ -1551,19 +1568,17 @@ module Kernel : BasicObject
|
|
|
1551
1568
|
|
|
1552
1569
|
# <!--
|
|
1553
1570
|
# rdoc-file=process.c
|
|
1554
|
-
# - sleep(
|
|
1571
|
+
# - sleep(secs = nil) -> slept_secs
|
|
1555
1572
|
# -->
|
|
1556
|
-
# Suspends the current thread for
|
|
1557
|
-
#
|
|
1558
|
-
# seconds
|
|
1559
|
-
# thread calls Thread#run. Called without an argument, sleep() will sleep
|
|
1560
|
-
# forever.
|
|
1573
|
+
# Suspends execution of the current thread for the number of seconds specified
|
|
1574
|
+
# by numeric argument `secs`, or forever if `secs` is `nil`; returns the integer
|
|
1575
|
+
# number of seconds suspended (rounded).
|
|
1561
1576
|
#
|
|
1562
|
-
# Time.new
|
|
1563
|
-
# sleep 1.2
|
|
1564
|
-
# Time.new
|
|
1565
|
-
# sleep 1.9
|
|
1566
|
-
# Time.new
|
|
1577
|
+
# Time.new # => 2008-03-08 19:56:19 +0900
|
|
1578
|
+
# sleep 1.2 # => 1
|
|
1579
|
+
# Time.new # => 2008-03-08 19:56:20 +0900
|
|
1580
|
+
# sleep 1.9 # => 2
|
|
1581
|
+
# Time.new # => 2008-03-08 19:56:22 +0900
|
|
1567
1582
|
#
|
|
1568
1583
|
def self?.sleep: (?nil) -> bot
|
|
1569
1584
|
| (Integer | Float | _Divmod duration) -> Integer
|
|
@@ -1676,31 +1691,31 @@ module Kernel : BasicObject
|
|
|
1676
1691
|
# newline character to the string if the string does not end in a newline, and
|
|
1677
1692
|
# calls Warning.warn with the string.
|
|
1678
1693
|
#
|
|
1679
|
-
#
|
|
1694
|
+
# warn("warning 1", "warning 2")
|
|
1680
1695
|
#
|
|
1681
|
-
#
|
|
1696
|
+
# *produces:*
|
|
1682
1697
|
#
|
|
1683
|
-
#
|
|
1684
|
-
#
|
|
1698
|
+
# warning 1
|
|
1699
|
+
# warning 2
|
|
1685
1700
|
#
|
|
1686
1701
|
# If the `uplevel` keyword argument is given, the string will be prepended with
|
|
1687
1702
|
# information for the given caller frame in the same format used by the
|
|
1688
1703
|
# `rb_warn` C function.
|
|
1689
1704
|
#
|
|
1690
|
-
#
|
|
1691
|
-
#
|
|
1692
|
-
#
|
|
1693
|
-
#
|
|
1705
|
+
# # In baz.rb
|
|
1706
|
+
# def foo
|
|
1707
|
+
# warn("invalid call to foo", uplevel: 1)
|
|
1708
|
+
# end
|
|
1694
1709
|
#
|
|
1695
|
-
#
|
|
1696
|
-
#
|
|
1697
|
-
#
|
|
1710
|
+
# def bar
|
|
1711
|
+
# foo
|
|
1712
|
+
# end
|
|
1698
1713
|
#
|
|
1699
|
-
#
|
|
1714
|
+
# bar
|
|
1700
1715
|
#
|
|
1701
|
-
#
|
|
1716
|
+
# *produces:*
|
|
1702
1717
|
#
|
|
1703
|
-
#
|
|
1718
|
+
# baz.rb:6: warning: invalid call to foo
|
|
1704
1719
|
#
|
|
1705
1720
|
# If `category` keyword argument is given, passes the category to
|
|
1706
1721
|
# `Warning.warn`. The category given must be be one of the following
|
|
@@ -1716,76 +1731,92 @@ module Kernel : BasicObject
|
|
|
1716
1731
|
|
|
1717
1732
|
# <!--
|
|
1718
1733
|
# rdoc-file=process.c
|
|
1719
|
-
# - exec([env,]
|
|
1734
|
+
# - exec([env, ] command_line, options = {})
|
|
1735
|
+
# - exec([env, ] exe_path, *args, options = {})
|
|
1720
1736
|
# -->
|
|
1721
|
-
# Replaces the current process by
|
|
1722
|
-
#
|
|
1737
|
+
# Replaces the current process by doing one of the following:
|
|
1738
|
+
#
|
|
1739
|
+
# * Passing string `command_line` to the shell.
|
|
1740
|
+
# * Invoking the executable at `exe_path`.
|
|
1741
|
+
#
|
|
1742
|
+
#
|
|
1743
|
+
# This method has potential security vulnerabilities if called with untrusted
|
|
1744
|
+
# input; see [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
1745
|
+
#
|
|
1746
|
+
# The new process is created using the [exec system
|
|
1747
|
+
# call](https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/functions/e
|
|
1748
|
+
# xecve.html); it may inherit some of its environment from the calling program
|
|
1749
|
+
# (possibly including open file descriptors).
|
|
1750
|
+
#
|
|
1751
|
+
# Argument `env`, if given, is a hash that affects `ENV` for the new process;
|
|
1752
|
+
# see [Execution Environment](rdoc-ref:Process@Execution+Environment).
|
|
1753
|
+
#
|
|
1754
|
+
# Argument `options` is a hash of options for the new process; see [Execution
|
|
1755
|
+
# Options](rdoc-ref:Process@Execution+Options).
|
|
1756
|
+
#
|
|
1757
|
+
# The first required argument is one of the following:
|
|
1758
|
+
#
|
|
1759
|
+
# * `command_line` if it is a string, and if it begins with a shell reserved
|
|
1760
|
+
# word or special built-in, or if it contains one or more meta characters.
|
|
1761
|
+
# * `exe_path` otherwise.
|
|
1723
1762
|
#
|
|
1724
|
-
# `exec(commandline)`
|
|
1725
|
-
# : command line string which is passed to the standard shell
|
|
1726
|
-
# `exec(cmdname, arg1, ...)`
|
|
1727
|
-
# : command name and one or more arguments (no shell)
|
|
1728
|
-
# `exec([cmdname, argv0], arg1, ...)`
|
|
1729
|
-
# : command name, `argv[0]` and zero or more arguments (no shell)
|
|
1730
1763
|
#
|
|
1764
|
+
# **Argument `command_line`**
|
|
1731
1765
|
#
|
|
1732
|
-
#
|
|
1733
|
-
# shell
|
|
1766
|
+
# String argument `command_line` is a command line to be passed to a shell; it
|
|
1767
|
+
# must begin with a shell reserved word, begin with a special built-in, or
|
|
1768
|
+
# contain meta characters:
|
|
1769
|
+
#
|
|
1770
|
+
# exec('if true; then echo "Foo"; fi') # Shell reserved word.
|
|
1771
|
+
# exec('echo') # Built-in.
|
|
1772
|
+
# exec('date > date.tmp') # Contains meta character.
|
|
1773
|
+
#
|
|
1774
|
+
# The command line may also contain arguments and options for the command:
|
|
1775
|
+
#
|
|
1776
|
+
# exec('echo "Foo"')
|
|
1777
|
+
#
|
|
1778
|
+
# Output:
|
|
1734
1779
|
#
|
|
1735
|
-
#
|
|
1736
|
-
# `ENV["RUBYSHELL"]` or `ENV["COMSPEC"]` on Windows and similar. The command is
|
|
1737
|
-
# passed as an argument to the `"-c"` switch to the shell, except in the case of
|
|
1738
|
-
# `COMSPEC`.
|
|
1780
|
+
# Foo
|
|
1739
1781
|
#
|
|
1740
|
-
#
|
|
1741
|
-
#
|
|
1782
|
+
# See [Execution Shell](rdoc-ref:Process@Execution+Shell) for details about the
|
|
1783
|
+
# shell.
|
|
1742
1784
|
#
|
|
1743
|
-
#
|
|
1744
|
-
# * not starting with shell reserved word or special built-in,
|
|
1785
|
+
# Raises an exception if the new process could not execute.
|
|
1745
1786
|
#
|
|
1787
|
+
# **Argument `exe_path`**
|
|
1746
1788
|
#
|
|
1747
|
-
#
|
|
1789
|
+
# Argument `exe_path` is one of the following:
|
|
1748
1790
|
#
|
|
1749
|
-
#
|
|
1750
|
-
#
|
|
1791
|
+
# * The string path to an executable to be called.
|
|
1792
|
+
# * A 2-element array containing the path to an executable and the string to
|
|
1793
|
+
# be used as the name of the executing process.
|
|
1751
1794
|
#
|
|
1752
|
-
# Note that this behavior is observable by pid obtained (return value of spawn()
|
|
1753
|
-
# and IO#pid for IO.popen) is the pid of the invoked command, not shell.
|
|
1754
1795
|
#
|
|
1755
|
-
#
|
|
1756
|
-
# command name and the rest are passed as parameters to command with no shell
|
|
1757
|
-
# expansion.
|
|
1796
|
+
# Example:
|
|
1758
1797
|
#
|
|
1759
|
-
#
|
|
1760
|
-
# two-element array at the beginning of the command, the first element is the
|
|
1761
|
-
# command to be executed, and the second argument is used as the `argv[0]`
|
|
1762
|
-
# value, which may show up in process listings.
|
|
1798
|
+
# exec('/usr/bin/date')
|
|
1763
1799
|
#
|
|
1764
|
-
#
|
|
1765
|
-
# so the running command may inherit some of the environment of the original
|
|
1766
|
-
# program (including open file descriptors).
|
|
1800
|
+
# Output:
|
|
1767
1801
|
#
|
|
1768
|
-
#
|
|
1769
|
-
# ::spawn for details.
|
|
1802
|
+
# Sat Aug 26 09:38:00 AM CDT 2023
|
|
1770
1803
|
#
|
|
1771
|
-
#
|
|
1772
|
-
# found) a SystemCallError exception is raised.
|
|
1804
|
+
# Ruby invokes the executable directly, with no shell and no shell expansion:
|
|
1773
1805
|
#
|
|
1774
|
-
#
|
|
1775
|
-
# `exec(2)` system call. See ::spawn for more details about the given `options`.
|
|
1806
|
+
# exec('doesnt_exist') # Raises Errno::ENOENT
|
|
1776
1807
|
#
|
|
1777
|
-
#
|
|
1808
|
+
# If one or more `args` is given, each is an argument or option to be passed to
|
|
1809
|
+
# the executable:
|
|
1778
1810
|
#
|
|
1779
|
-
#
|
|
1811
|
+
# exec('echo', 'C*')
|
|
1812
|
+
# exec('echo', 'hello', 'world')
|
|
1780
1813
|
#
|
|
1781
|
-
#
|
|
1782
|
-
# not acceptable.
|
|
1814
|
+
# Output:
|
|
1783
1815
|
#
|
|
1784
|
-
#
|
|
1785
|
-
#
|
|
1816
|
+
# C*
|
|
1817
|
+
# hello world
|
|
1786
1818
|
#
|
|
1787
|
-
#
|
|
1788
|
-
# # never get here
|
|
1819
|
+
# Raises an exception if the new process could not execute.
|
|
1789
1820
|
#
|
|
1790
1821
|
def self?.exec: (String command, *String args, ?unsetenv_others: boolish, ?pgroup: true | Integer, ?umask: Integer, ?in: redirect_fd, ?out: redirect_fd, ?err: redirect_fd, ?close_others: boolish, ?chdir: String) -> bot
|
|
1791
1822
|
| (Hash[string, string?] env, String command, *String args, ?unsetenv_others: boolish, ?pgroup: true | Integer, ?umask: Integer, ?in: redirect_fd, ?out: redirect_fd, ?err: redirect_fd, ?close_others: boolish, ?chdir: String) -> bot
|
|
@@ -1794,304 +1825,235 @@ module Kernel : BasicObject
|
|
|
1794
1825
|
|
|
1795
1826
|
# <!--
|
|
1796
1827
|
# rdoc-file=process.c
|
|
1797
|
-
# - spawn([env,]
|
|
1798
|
-
# -
|
|
1799
|
-
# -->
|
|
1800
|
-
#
|
|
1801
|
-
#
|
|
1802
|
-
# pid = spawn("tar xf ruby-2.0.0-p195.tar.bz2")
|
|
1803
|
-
# Process.wait pid
|
|
1804
|
-
#
|
|
1805
|
-
# pid = spawn(RbConfig.ruby, "-eputs'Hello, world!'")
|
|
1806
|
-
# Process.wait pid
|
|
1807
|
-
#
|
|
1808
|
-
# This method is similar to Kernel#system but it doesn't wait for the command to
|
|
1809
|
-
# finish.
|
|
1810
|
-
#
|
|
1811
|
-
# The parent process should use Process.wait to collect the termination status
|
|
1812
|
-
# of its child or use Process.detach to register disinterest in their status;
|
|
1813
|
-
# otherwise, the operating system may accumulate zombie processes.
|
|
1814
|
-
#
|
|
1815
|
-
# spawn has bunch of options to specify process attributes:
|
|
1816
|
-
#
|
|
1817
|
-
# env: hash
|
|
1818
|
-
# name => val : set the environment variable
|
|
1819
|
-
# name => nil : unset the environment variable
|
|
1820
|
-
#
|
|
1821
|
-
# the keys and the values except for +nil+ must be strings.
|
|
1822
|
-
# command...:
|
|
1823
|
-
# commandline : command line string which is passed to the standard shell
|
|
1824
|
-
# cmdname, arg1, ... : command name and one or more arguments (This form does not use the shell. See below for caveats.)
|
|
1825
|
-
# [cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell)
|
|
1826
|
-
# options: hash
|
|
1827
|
-
# clearing environment variables:
|
|
1828
|
-
# :unsetenv_others => true : clear environment variables except specified by env
|
|
1829
|
-
# :unsetenv_others => false : don't clear (default)
|
|
1830
|
-
# process group:
|
|
1831
|
-
# :pgroup => true or 0 : make a new process group
|
|
1832
|
-
# :pgroup => pgid : join the specified process group
|
|
1833
|
-
# :pgroup => nil : don't change the process group (default)
|
|
1834
|
-
# create new process group: Windows only
|
|
1835
|
-
# :new_pgroup => true : the new process is the root process of a new process group
|
|
1836
|
-
# :new_pgroup => false : don't create a new process group (default)
|
|
1837
|
-
# resource limit: resourcename is core, cpu, data, etc. See Process.setrlimit.
|
|
1838
|
-
# :rlimit_resourcename => limit
|
|
1839
|
-
# :rlimit_resourcename => [cur_limit, max_limit]
|
|
1840
|
-
# umask:
|
|
1841
|
-
# :umask => int
|
|
1842
|
-
# redirection:
|
|
1843
|
-
# key:
|
|
1844
|
-
# FD : single file descriptor in child process
|
|
1845
|
-
# [FD, FD, ...] : multiple file descriptor in child process
|
|
1846
|
-
# value:
|
|
1847
|
-
# FD : redirect to the file descriptor in parent process
|
|
1848
|
-
# string : redirect to file with open(string, "r" or "w")
|
|
1849
|
-
# [string] : redirect to file with open(string, File::RDONLY)
|
|
1850
|
-
# [string, open_mode] : redirect to file with open(string, open_mode, 0644)
|
|
1851
|
-
# [string, open_mode, perm] : redirect to file with open(string, open_mode, perm)
|
|
1852
|
-
# [:child, FD] : redirect to the redirected file descriptor
|
|
1853
|
-
# :close : close the file descriptor in child process
|
|
1854
|
-
# FD is one of follows
|
|
1855
|
-
# :in : the file descriptor 0 which is the standard input
|
|
1856
|
-
# :out : the file descriptor 1 which is the standard output
|
|
1857
|
-
# :err : the file descriptor 2 which is the standard error
|
|
1858
|
-
# integer : the file descriptor of specified the integer
|
|
1859
|
-
# io : the file descriptor specified as io.fileno
|
|
1860
|
-
# file descriptor inheritance: close non-redirected non-standard fds (3, 4, 5, ...) or not
|
|
1861
|
-
# :close_others => false : inherit
|
|
1862
|
-
# current directory:
|
|
1863
|
-
# :chdir => str
|
|
1864
|
-
#
|
|
1865
|
-
# The `cmdname, arg1, ...` form does not use the shell. However, on different
|
|
1866
|
-
# OSes, different things are provided as built-in commands. An example of this
|
|
1867
|
-
# is +'echo'+, which is a built-in on Windows, but is a normal program on Linux
|
|
1868
|
-
# and Mac OS X. This means that `Process.spawn 'echo', '%Path%'` will display
|
|
1869
|
-
# the contents of the `%Path%` environment variable on Windows, but
|
|
1870
|
-
# `Process.spawn 'echo', '$PATH'` prints the literal `$PATH`.
|
|
1871
|
-
#
|
|
1872
|
-
# If a hash is given as `env`, the environment is updated by `env` before
|
|
1873
|
-
# `exec(2)` in the child process. If a pair in `env` has nil as the value, the
|
|
1874
|
-
# variable is deleted.
|
|
1875
|
-
#
|
|
1876
|
-
# # set FOO as BAR and unset BAZ.
|
|
1877
|
-
# pid = spawn({"FOO"=>"BAR", "BAZ"=>nil}, command)
|
|
1878
|
-
#
|
|
1879
|
-
# If a hash is given as `options`, it specifies process group, create new
|
|
1880
|
-
# process group, resource limit, current directory, umask and redirects for the
|
|
1881
|
-
# child process. Also, it can be specified to clear environment variables.
|
|
1882
|
-
#
|
|
1883
|
-
# The `:unsetenv_others` key in `options` specifies to clear environment
|
|
1884
|
-
# variables, other than specified by `env`.
|
|
1885
|
-
#
|
|
1886
|
-
# pid = spawn(command, :unsetenv_others=>true) # no environment variable
|
|
1887
|
-
# pid = spawn({"FOO"=>"BAR"}, command, :unsetenv_others=>true) # FOO only
|
|
1888
|
-
#
|
|
1889
|
-
# The `:pgroup` key in `options` specifies a process group. The corresponding
|
|
1890
|
-
# value should be true, zero, a positive integer, or nil. true and zero cause
|
|
1891
|
-
# the process to be a process leader of a new process group. A non-zero positive
|
|
1892
|
-
# integer causes the process to join the provided process group. The default
|
|
1893
|
-
# value, nil, causes the process to remain in the same process group.
|
|
1894
|
-
#
|
|
1895
|
-
# pid = spawn(command, :pgroup=>true) # process leader
|
|
1896
|
-
# pid = spawn(command, :pgroup=>10) # belongs to the process group 10
|
|
1897
|
-
#
|
|
1898
|
-
# The `:new_pgroup` key in `options` specifies to pass
|
|
1899
|
-
# `CREATE_NEW_PROCESS_GROUP` flag to `CreateProcessW()` that is Windows API.
|
|
1900
|
-
# This option is only for Windows. true means the new process is the root
|
|
1901
|
-
# process of the new process group. The new process has CTRL+C disabled. This
|
|
1902
|
-
# flag is necessary for `Process.kill(:SIGINT, pid)` on the subprocess.
|
|
1903
|
-
# :new_pgroup is false by default.
|
|
1904
|
-
#
|
|
1905
|
-
# pid = spawn(command, :new_pgroup=>true) # new process group
|
|
1906
|
-
# pid = spawn(command, :new_pgroup=>false) # same process group
|
|
1907
|
-
#
|
|
1908
|
-
# The `:rlimit_`*foo* key specifies a resource limit. *foo* should be one of
|
|
1909
|
-
# resource types such as `core`. The corresponding value should be an integer or
|
|
1910
|
-
# an array which have one or two integers: same as cur_limit and max_limit
|
|
1911
|
-
# arguments for Process.setrlimit.
|
|
1912
|
-
#
|
|
1913
|
-
# cur, max = Process.getrlimit(:CORE)
|
|
1914
|
-
# pid = spawn(command, :rlimit_core=>[0,max]) # disable core temporary.
|
|
1915
|
-
# pid = spawn(command, :rlimit_core=>max) # enable core dump
|
|
1916
|
-
# pid = spawn(command, :rlimit_core=>0) # never dump core.
|
|
1917
|
-
#
|
|
1918
|
-
# The `:umask` key in `options` specifies the umask.
|
|
1919
|
-
#
|
|
1920
|
-
# pid = spawn(command, :umask=>077)
|
|
1921
|
-
#
|
|
1922
|
-
# The :in, :out, :err, an integer, an IO and an array key specifies a
|
|
1923
|
-
# redirection. The redirection maps a file descriptor in the child process.
|
|
1924
|
-
#
|
|
1925
|
-
# For example, stderr can be merged into stdout as follows:
|
|
1926
|
-
#
|
|
1927
|
-
# pid = spawn(command, :err=>:out)
|
|
1928
|
-
# pid = spawn(command, 2=>1)
|
|
1929
|
-
# pid = spawn(command, STDERR=>:out)
|
|
1930
|
-
# pid = spawn(command, STDERR=>STDOUT)
|
|
1931
|
-
#
|
|
1932
|
-
# The hash keys specifies a file descriptor in the child process started by
|
|
1933
|
-
# #spawn. :err, 2 and STDERR specifies the standard error stream (stderr).
|
|
1934
|
-
#
|
|
1935
|
-
# The hash values specifies a file descriptor in the parent process which
|
|
1936
|
-
# invokes #spawn. :out, 1 and STDOUT specifies the standard output stream
|
|
1937
|
-
# (stdout).
|
|
1938
|
-
#
|
|
1939
|
-
# In the above example, the standard output in the child process is not
|
|
1940
|
-
# specified. So it is inherited from the parent process.
|
|
1828
|
+
# - spawn([env, ] command_line, options = {}) -> pid
|
|
1829
|
+
# - spawn([env, ] exe_path, *args, options = {}) -> pid
|
|
1830
|
+
# -->
|
|
1831
|
+
# Creates a new child process by doing one of the following in that process:
|
|
1941
1832
|
#
|
|
1942
|
-
#
|
|
1833
|
+
# * Passing string `command_line` to the shell.
|
|
1834
|
+
# * Invoking the executable at `exe_path`.
|
|
1943
1835
|
#
|
|
1944
|
-
# A filename can be specified as a hash value.
|
|
1945
1836
|
#
|
|
1946
|
-
#
|
|
1947
|
-
#
|
|
1948
|
-
# pid = spawn(command, :err=>"log") # write mode
|
|
1949
|
-
# pid = spawn(command, [:out, :err]=>"/dev/null") # write mode
|
|
1950
|
-
# pid = spawn(command, 3=>"/dev/null") # read mode
|
|
1837
|
+
# This method has potential security vulnerabilities if called with untrusted
|
|
1838
|
+
# input; see [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
1951
1839
|
#
|
|
1952
|
-
#
|
|
1953
|
-
#
|
|
1840
|
+
# Returns the process ID (pid) of the new process, without waiting for it to
|
|
1841
|
+
# complete.
|
|
1954
1842
|
#
|
|
1955
|
-
#
|
|
1956
|
-
# used instead.
|
|
1843
|
+
# To avoid zombie processes, the parent process should call either:
|
|
1957
1844
|
#
|
|
1958
|
-
#
|
|
1959
|
-
#
|
|
1960
|
-
# pid = spawn(command, :out=>["log", "w"]) # 0644 assumed
|
|
1961
|
-
# pid = spawn(command, :out=>["log", "w", 0600])
|
|
1962
|
-
# pid = spawn(command, :out=>["log", File::WRONLY|File::EXCL|File::CREAT, 0600])
|
|
1845
|
+
# * Process.wait, to collect the termination statuses of its children.
|
|
1846
|
+
# * Process.detach, to register disinterest in their status.
|
|
1963
1847
|
#
|
|
1964
|
-
# The array specifies a filename, flags and permission. The flags can be a
|
|
1965
|
-
# string or an integer. If the flags is omitted or nil, File::RDONLY is assumed.
|
|
1966
|
-
# The permission should be an integer. If the permission is omitted or nil, 0644
|
|
1967
|
-
# is assumed.
|
|
1968
1848
|
#
|
|
1969
|
-
#
|
|
1970
|
-
#
|
|
1849
|
+
# The new process is created using the [exec system
|
|
1850
|
+
# call](https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/functions/e
|
|
1851
|
+
# xecve.html); it may inherit some of its environment from the calling program
|
|
1852
|
+
# (possibly including open file descriptors).
|
|
1971
1853
|
#
|
|
1972
|
-
#
|
|
1973
|
-
#
|
|
1974
|
-
# pid = spawn(command, [:out, :err]=>["log", "w"])
|
|
1854
|
+
# Argument `env`, if given, is a hash that affects `ENV` for the new process;
|
|
1855
|
+
# see [Execution Environment](rdoc-ref:Process@Execution+Environment).
|
|
1975
1856
|
#
|
|
1976
|
-
#
|
|
1977
|
-
#
|
|
1978
|
-
# example, :err=>:out means redirecting child stderr to parent stdout. But
|
|
1979
|
-
# :err=>[:child, :out] means redirecting child stderr to child stdout. They
|
|
1980
|
-
# differ if stdout is redirected in the child process as follows.
|
|
1857
|
+
# Argument `options` is a hash of options for the new process; see [Execution
|
|
1858
|
+
# Options](rdoc-ref:Process@Execution+Options).
|
|
1981
1859
|
#
|
|
1982
|
-
#
|
|
1983
|
-
# # The file "log" is opened just once.
|
|
1984
|
-
# pid = spawn(command, :out=>["log", "w"], :err=>[:child, :out])
|
|
1860
|
+
# The first required argument is one of the following:
|
|
1985
1861
|
#
|
|
1986
|
-
#
|
|
1987
|
-
#
|
|
1988
|
-
#
|
|
1862
|
+
# * `command_line` if it is a string, and if it begins with a shell reserved
|
|
1863
|
+
# word or special built-in, or if it contains one or more meta characters.
|
|
1864
|
+
# * `exe_path` otherwise.
|
|
1989
1865
|
#
|
|
1990
|
-
# io = IO.popen(["sh", "-c", "echo out; echo err >&2", :err=>[:child, :out]])
|
|
1991
|
-
# p io.read #=> "out\nerr\n"
|
|
1992
1866
|
#
|
|
1993
|
-
#
|
|
1867
|
+
# **Argument `command_line`**
|
|
1994
1868
|
#
|
|
1995
|
-
#
|
|
1869
|
+
# String argument `command_line` is a command line to be passed to a shell; it
|
|
1870
|
+
# must begin with a shell reserved word, begin with a special built-in, or
|
|
1871
|
+
# contain meta characters:
|
|
1872
|
+
#
|
|
1873
|
+
# spawn('if true; then echo "Foo"; fi') # => 798847 # Shell reserved word.
|
|
1874
|
+
# Process.wait # => 798847
|
|
1875
|
+
# spawn('echo') # => 798848 # Built-in.
|
|
1876
|
+
# Process.wait # => 798848
|
|
1877
|
+
# spawn('date > /tmp/date.tmp') # => 798879 # Contains meta character.
|
|
1878
|
+
# Process.wait # => 798849
|
|
1879
|
+
# spawn('date > /nop/date.tmp') # => 798882 # Issues error message.
|
|
1880
|
+
# Process.wait # => 798882
|
|
1881
|
+
#
|
|
1882
|
+
# The command line may also contain arguments and options for the command:
|
|
1883
|
+
#
|
|
1884
|
+
# spawn('echo "Foo"') # => 799031
|
|
1885
|
+
# Process.wait # => 799031
|
|
1886
|
+
#
|
|
1887
|
+
# Output:
|
|
1996
1888
|
#
|
|
1997
|
-
#
|
|
1998
|
-
# "standard" descriptors are 0, 1 and 2. This behavior is specified by
|
|
1999
|
-
# :close_others option. :close_others doesn't affect the standard descriptors
|
|
2000
|
-
# which are closed only if :close is specified explicitly.
|
|
1889
|
+
# Foo
|
|
2001
1890
|
#
|
|
2002
|
-
#
|
|
2003
|
-
#
|
|
1891
|
+
# See [Execution Shell](rdoc-ref:Process@Execution+Shell) for details about the
|
|
1892
|
+
# shell.
|
|
2004
1893
|
#
|
|
2005
|
-
#
|
|
1894
|
+
# Raises an exception if the new process could not execute.
|
|
2006
1895
|
#
|
|
2007
|
-
#
|
|
2008
|
-
# :close_others option.
|
|
1896
|
+
# **Argument `exe_path`**
|
|
2009
1897
|
#
|
|
2010
|
-
#
|
|
1898
|
+
# Argument `exe_path` is one of the following:
|
|
2011
1899
|
#
|
|
2012
|
-
#
|
|
2013
|
-
# r, w = IO.pipe
|
|
2014
|
-
# pid = spawn(command, :out=>w) # r, w is closed in the child process.
|
|
2015
|
-
# w.close
|
|
1900
|
+
# * The string path to an executable to be called:
|
|
2016
1901
|
#
|
|
2017
|
-
#
|
|
1902
|
+
# spawn('/usr/bin/date') # Path to date on Unix-style system.
|
|
1903
|
+
# Process.wait
|
|
2018
1904
|
#
|
|
2019
|
-
#
|
|
2020
|
-
# system(command, f=>:close) # don't inherit f.
|
|
1905
|
+
# Output:
|
|
2021
1906
|
#
|
|
2022
|
-
#
|
|
1907
|
+
# Thu Aug 31 10:06:48 AM CDT 2023
|
|
2023
1908
|
#
|
|
2024
|
-
#
|
|
2025
|
-
#
|
|
2026
|
-
# log_r, log_w = IO.pipe
|
|
2027
|
-
# pid = spawn("valgrind", "--log-fd=#{log_w.fileno}", "echo", "a", log_w=>log_w)
|
|
2028
|
-
# log_w.close
|
|
2029
|
-
# p log_r.read
|
|
1909
|
+
# * A 2-element array containing the path to an executable and the string to
|
|
1910
|
+
# be used as the name of the executing process:
|
|
2030
1911
|
#
|
|
2031
|
-
#
|
|
1912
|
+
# pid = spawn(['sleep', 'Hello!'], '1') # 2-element array.
|
|
1913
|
+
# p `ps -p #{pid} -o command=`
|
|
2032
1914
|
#
|
|
2033
|
-
#
|
|
1915
|
+
# Output:
|
|
2034
1916
|
#
|
|
2035
|
-
#
|
|
2036
|
-
# specifies file descriptors in the parent process. So the above specifies
|
|
2037
|
-
# exchanging stdout and stderr. Internally, `spawn` uses an extra file
|
|
2038
|
-
# descriptor to resolve such cyclic file descriptor mapping.
|
|
1917
|
+
# "Hello! 1\n"
|
|
2039
1918
|
#
|
|
2040
|
-
#
|
|
1919
|
+
#
|
|
1920
|
+
# Ruby invokes the executable directly, with no shell and no shell expansion.
|
|
1921
|
+
#
|
|
1922
|
+
# If one or more `args` is given, each is an argument or option to be passed to
|
|
1923
|
+
# the executable:
|
|
1924
|
+
#
|
|
1925
|
+
# spawn('echo', 'C*') # => 799392
|
|
1926
|
+
# Process.wait # => 799392
|
|
1927
|
+
# spawn('echo', 'hello', 'world') # => 799393
|
|
1928
|
+
# Process.wait # => 799393
|
|
1929
|
+
#
|
|
1930
|
+
# Output:
|
|
1931
|
+
#
|
|
1932
|
+
# C*
|
|
1933
|
+
# hello world
|
|
1934
|
+
#
|
|
1935
|
+
# Raises an exception if the new process could not execute.
|
|
2041
1936
|
#
|
|
2042
1937
|
def self?.spawn: (String command, *String args, ?unsetenv_others: boolish, ?pgroup: true | Integer, ?umask: Integer, ?in: redirect_fd, ?out: redirect_fd, ?err: redirect_fd, ?close_others: boolish, ?chdir: String) -> Integer
|
|
2043
1938
|
| (Hash[string, string?] env, String command, *String args, ?unsetenv_others: boolish, ?pgroup: true | Integer, ?umask: Integer, ?in: redirect_fd, ?out: redirect_fd, ?err: redirect_fd, ?close_others: boolish, ?chdir: String) -> Integer
|
|
2044
1939
|
|
|
2045
1940
|
# <!--
|
|
2046
1941
|
# rdoc-file=process.c
|
|
2047
|
-
# - system([env,]
|
|
1942
|
+
# - system([env, ] command_line, options = {}, exception: false) -> true, false, or nil
|
|
1943
|
+
# - system([env, ] exe_path, *args, options = {}, exception: false) -> true, false, or nil
|
|
2048
1944
|
# -->
|
|
2049
|
-
#
|
|
1945
|
+
# Creates a new child process by doing one of the following in that process:
|
|
1946
|
+
#
|
|
1947
|
+
# * Passing string `command_line` to the shell.
|
|
1948
|
+
# * Invoking the executable at `exe_path`.
|
|
1949
|
+
#
|
|
2050
1950
|
#
|
|
2051
1951
|
# This method has potential security vulnerabilities if called with untrusted
|
|
2052
1952
|
# input; see [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2053
1953
|
#
|
|
2054
|
-
#
|
|
2055
|
-
# : command line string which is passed to the standard shell
|
|
2056
|
-
# `cmdname, arg1, ...`
|
|
2057
|
-
# : command name and one or more arguments (no shell)
|
|
2058
|
-
# `[cmdname, argv0], arg1, ...`
|
|
2059
|
-
# : command name, `argv[0]` and zero or more arguments (no shell)
|
|
1954
|
+
# Returns:
|
|
2060
1955
|
#
|
|
1956
|
+
# * `true` if the command exits with status zero.
|
|
1957
|
+
# * `false` if the exit status is a non-zero integer.
|
|
1958
|
+
# * `nil` if the command could not execute.
|
|
2061
1959
|
#
|
|
2062
|
-
# system returns `true` if the command gives zero exit status, `false` for non
|
|
2063
|
-
# zero exit status. Returns `nil` if command execution fails. An error status is
|
|
2064
|
-
# available in `$?`.
|
|
2065
1960
|
#
|
|
2066
|
-
#
|
|
2067
|
-
#
|
|
1961
|
+
# Raises an exception (instead of returning `false` or `nil`) if keyword
|
|
1962
|
+
# argument `exception` is set to `true`.
|
|
2068
1963
|
#
|
|
2069
|
-
#
|
|
1964
|
+
# Assigns the command's error status to `$?`.
|
|
2070
1965
|
#
|
|
2071
|
-
# The
|
|
2072
|
-
#
|
|
1966
|
+
# The new process is created using the [system system
|
|
1967
|
+
# call](https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/functions/s
|
|
1968
|
+
# ystem.html); it may inherit some of its environment from the calling program
|
|
1969
|
+
# (possibly including open file descriptors).
|
|
2073
1970
|
#
|
|
2074
|
-
#
|
|
2075
|
-
#
|
|
1971
|
+
# Argument `env`, if given, is a hash that affects `ENV` for the new process;
|
|
1972
|
+
# see [Execution Environment](rdoc-ref:Process@Execution+Environment).
|
|
2076
1973
|
#
|
|
2077
|
-
#
|
|
1974
|
+
# Argument `options` is a hash of options for the new process; see [Execution
|
|
1975
|
+
# Options](rdoc-ref:Process@Execution+Options).
|
|
1976
|
+
#
|
|
1977
|
+
# The first required argument is one of the following:
|
|
1978
|
+
#
|
|
1979
|
+
# * `command_line` if it is a string, and if it begins with a shell reserved
|
|
1980
|
+
# word or special built-in, or if it contains one or more meta characters.
|
|
1981
|
+
# * `exe_path` otherwise.
|
|
1982
|
+
#
|
|
1983
|
+
#
|
|
1984
|
+
# **Argument `command_line`**
|
|
1985
|
+
#
|
|
1986
|
+
# String argument `command_line` is a command line to be passed to a shell; it
|
|
1987
|
+
# must begin with a shell reserved word, begin with a special built-in, or
|
|
1988
|
+
# contain meta characters:
|
|
1989
|
+
#
|
|
1990
|
+
# system('if true; then echo "Foo"; fi') # => true # Shell reserved word.
|
|
1991
|
+
# system('echo') # => true # Built-in.
|
|
1992
|
+
# system('date > /tmp/date.tmp') # => true # Contains meta character.
|
|
1993
|
+
# system('date > /nop/date.tmp') # => false
|
|
1994
|
+
# system('date > /nop/date.tmp', exception: true) # Raises RuntimeError.
|
|
1995
|
+
#
|
|
1996
|
+
# Assigns the command's error status to `$?`:
|
|
1997
|
+
#
|
|
1998
|
+
# system('echo') # => true # Built-in.
|
|
1999
|
+
# $? # => #<Process::Status: pid 640610 exit 0>
|
|
2000
|
+
# system('date > /nop/date.tmp') # => false
|
|
2001
|
+
# $? # => #<Process::Status: pid 640742 exit 2>
|
|
2002
|
+
#
|
|
2003
|
+
# The command line may also contain arguments and options for the command:
|
|
2004
|
+
#
|
|
2005
|
+
# system('echo "Foo"') # => true
|
|
2006
|
+
#
|
|
2007
|
+
# Output:
|
|
2078
2008
|
#
|
|
2079
|
-
#
|
|
2080
|
-
# *
|
|
2009
|
+
# Foo
|
|
2081
2010
|
#
|
|
2082
|
-
#
|
|
2011
|
+
# See [Execution Shell](rdoc-ref:Process@Execution+Shell) for details about the
|
|
2012
|
+
# shell.
|
|
2083
2013
|
#
|
|
2084
|
-
#
|
|
2085
|
-
# # => false
|
|
2086
|
-
# system("catt nonexistent.txt")
|
|
2087
|
-
# # => nil
|
|
2014
|
+
# Raises an exception if the new process could not execute.
|
|
2088
2015
|
#
|
|
2089
|
-
#
|
|
2090
|
-
# # RuntimeError (Command failed with exit 1: cat)
|
|
2091
|
-
# system("catt nonexistent.txt", exception: true)
|
|
2092
|
-
# # Errno::ENOENT (No such file or directory - catt)
|
|
2016
|
+
# **Argument `exe_path`**
|
|
2093
2017
|
#
|
|
2094
|
-
#
|
|
2018
|
+
# Argument `exe_path` is one of the following:
|
|
2019
|
+
#
|
|
2020
|
+
# * The string path to an executable to be called.
|
|
2021
|
+
# * A 2-element array containing the path to an executable and the string to
|
|
2022
|
+
# be used as the name of the executing process.
|
|
2023
|
+
#
|
|
2024
|
+
#
|
|
2025
|
+
# Example:
|
|
2026
|
+
#
|
|
2027
|
+
# system('/usr/bin/date') # => true # Path to date on Unix-style system.
|
|
2028
|
+
# system('foo') # => nil # Command failed.
|
|
2029
|
+
#
|
|
2030
|
+
# Output:
|
|
2031
|
+
#
|
|
2032
|
+
# Mon Aug 28 11:43:10 AM CDT 2023
|
|
2033
|
+
#
|
|
2034
|
+
# Assigns the command's error status to `$?`:
|
|
2035
|
+
#
|
|
2036
|
+
# system('/usr/bin/date') # => true
|
|
2037
|
+
# $? # => #<Process::Status: pid 645605 exit 0>
|
|
2038
|
+
# system('foo') # => nil
|
|
2039
|
+
# $? # => #<Process::Status: pid 645608 exit 127>
|
|
2040
|
+
#
|
|
2041
|
+
# Ruby invokes the executable directly, with no shell and no shell expansion:
|
|
2042
|
+
#
|
|
2043
|
+
# system('doesnt_exist') # => nil
|
|
2044
|
+
#
|
|
2045
|
+
# If one or more `args` is given, each is an argument or option to be passed to
|
|
2046
|
+
# the executable:
|
|
2047
|
+
#
|
|
2048
|
+
# system('echo', 'C*') # => true
|
|
2049
|
+
# system('echo', 'hello', 'world') # => true
|
|
2050
|
+
#
|
|
2051
|
+
# Output:
|
|
2052
|
+
#
|
|
2053
|
+
# C*
|
|
2054
|
+
# hello world
|
|
2055
|
+
#
|
|
2056
|
+
# Raises an exception if the new process could not execute.
|
|
2095
2057
|
#
|
|
2096
2058
|
def self?.system: (String command, *String args, ?unsetenv_others: boolish, ?pgroup: true | Integer, ?umask: Integer, ?in: redirect_fd, ?out: redirect_fd, ?err: redirect_fd, ?close_others: boolish, ?chdir: String) -> (NilClass | FalseClass | TrueClass)
|
|
2097
2059
|
| (Hash[string, string?] env, String command, *String args, ?unsetenv_others: boolish, ?pgroup: true | Integer, ?umask: Integer, ?in: redirect_fd, ?out: redirect_fd, ?err: redirect_fd, ?close_others: boolish, ?chdir: String) -> (NilClass | FalseClass | TrueClass)
|
|
@@ -2956,15 +2918,6 @@ module Kernel : BasicObject
|
|
|
2956
2918
|
#
|
|
2957
2919
|
# "my string".yield_self {|s| s.upcase } #=> "MY STRING"
|
|
2958
2920
|
#
|
|
2959
|
-
# Good usage for `then` is value piping in method chains:
|
|
2960
|
-
#
|
|
2961
|
-
# require 'open-uri'
|
|
2962
|
-
# require 'json'
|
|
2963
|
-
#
|
|
2964
|
-
# construct_url(arguments).
|
|
2965
|
-
# then {|url| URI(url).read }.
|
|
2966
|
-
# then {|response| JSON.parse(response) }
|
|
2967
|
-
#
|
|
2968
2921
|
def yield_self: [X] () { (self) -> X } -> X
|
|
2969
2922
|
| () -> Enumerator[self, untyped]
|
|
2970
2923
|
|