Method: Dir.chdir

Defined in:
dir.c

.chdir([ string]) ⇒ 0 .chdir([ string]) {|path| ... } ⇒ Object

Changes the current working directory of the process to the given string. When called without an argument, changes the directory to the value of the environment variable HOME, or LOGDIR. SystemCallError (probably Errno::ENOENT) if the target directory does not exist.

If a block is given, it is passed the name of the new current directory, and the block is executed with that as the current directory. The original working directory is restored when the block exits. The return value of chdir is the value of the block. chdir blocks can be nested, but in a multi-threaded program an error will be raised if a thread attempts to open a chdir block while another thread has one open.

Dir.chdir("/var/spool/mail")
puts Dir.pwd
Dir.chdir("/tmp") do
  puts Dir.pwd
  Dir.chdir("/usr") do
    puts Dir.pwd
  end
  puts Dir.pwd
end
puts Dir.pwd

produces:

/var/spool/mail
/tmp
/usr
/tmp
/var/spool/mail

Overloads:

  • .chdir([ string]) ⇒ 0

    Returns:

    • (0)
  • .chdir([ string]) {|path| ... } ⇒ Object

    Yields:

    Returns:



1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
# File 'dir.c', line 1076

static VALUE
dir_s_chdir(int argc, VALUE *argv, VALUE obj)
{
    VALUE path = Qnil;

    if (rb_check_arity(argc, 0, 1) == 1) {
        path = rb_str_encode_ospath(rb_get_path(argv[0]));
    }
    else {
  const char *dist = getenv("HOME");
  if (!dist) {
      dist = getenv("LOGDIR");
      if (!dist) rb_raise(rb_eArgError, "HOME/LOGDIR not set");
  }
  path = rb_str_new2(dist);
    }

    if (chdir_blocking > 0) {
  if (!rb_block_given_p() || rb_thread_current() != chdir_thread)
      rb_warn("conflicting chdir during another chdir block");
    }

    if (rb_block_given_p()) {
  struct chdir_data args;

  args.old_path = rb_str_encode_ospath(rb_dir_getwd());
  args.new_path = path;
  args.done = FALSE;
  return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args);
    }
    else {
  char *p = RSTRING_PTR(path);
  int r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_chdir, p,
              RUBY_UBF_IO, 0);
  if (r < 0)
      rb_sys_fail_path(path);
    }

    return INT2FIX(0);
}