Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从特定目录运行shell命令_Ruby_Shell - Fatal编程技术网

Ruby 从特定目录运行shell命令

Ruby 从特定目录运行shell命令,ruby,shell,Ruby,Shell,Ruby似乎使用/bin/sh作为shell解释器,它在*nix机器上不理解/bin/bash命令,例如pushd。这是irb告诉我的: 1.9.3-p327 :011 > `pushd /tmp; echo foo` sh: 1: pushd: not found => "foo\n" 在OSX上,/bin/sh是bash的别名,因此上面的代码段在那里运行良好。有没有办法强迫*nix机器上的Ruby使用/bin/bash来解释shell命令? Dir.chdir("/bin")

Ruby似乎使用
/bin/sh
作为shell解释器,它在*nix机器上不理解
/bin/bash
命令,例如
pushd
。这是
irb
告诉我的:

1.9.3-p327 :011 > `pushd /tmp; echo foo`
sh: 1: pushd: not found
=> "foo\n"
在OSX上,
/bin/sh
是bash的别名,因此上面的代码段在那里运行良好。有没有办法强迫*nix机器上的Ruby使用
/bin/bash
来解释shell命令?

Dir.chdir("/bin")
然后执行命令:

`pushd /tmp; echo foo`

然后执行命令:

`pushd /tmp; echo foo`

/bin/sh是在ruby源代码中硬编码的。因此,无法更改默认shell。您可以使用其他建议的方法。

/bin/sh在ruby源代码中是硬编码的。因此,无法更改默认shell。您可以使用其他建议的方法。

在Ruby中使用Bash命令,如
pushd
,是毫无意义的,因为这些命令会影响Bash解释器的内部状态,当您使用backticks或
system
从Ruby运行shell命令时,它会创建一个新的子进程,运行该命令,然后关闭该子流程

这意味着,即使您设法从Ruby以Bash命令的形式运行
pushd
,也会发生Bash子进程将启动,将目录推送到目录堆栈,然后退出。您对目录堆栈所做的更改将与所有其他子进程的数据一起被擦除—下次使用shell命令时,您将不在该目录下

您使用的是Ruby而不是Bash编写脚本-内部Bash命令在这里没有任何意义,因此您需要使用Ruby等价物。例如,不要写:

system 'pushd /tmp'
system 'touch file_in_tmp'
system 'popd'
这是行不通的,你想做的是:

Dir.chdir '/tmp' do
    system 'touch file_in_tmp'
end

在Ruby中使用像
pushd
这样的Bash命令是毫无意义的,因为这些命令会影响Bash解释器的内部状态,当您使用backticks或
system
从Ruby运行shell命令时,它会创建一个新的子进程,运行该命令,然后关闭该子进程

这意味着,即使您设法从Ruby以Bash命令的形式运行
pushd
,也会发生Bash子进程将启动,将目录推送到目录堆栈,然后退出。您对目录堆栈所做的更改将与所有其他子进程的数据一起被擦除—下次使用shell命令时,您将不在该目录下

您使用的是Ruby而不是Bash编写脚本-内部Bash命令在这里没有任何意义,因此您需要使用Ruby等价物。例如,不要写:

system 'pushd /tmp'
system 'touch file_in_tmp'
system 'popd'
这是行不通的,你想做的是:

Dir.chdir '/tmp' do
    system 'touch file_in_tmp'
end

脚本的运行方式都在一行中,比如说
pushd/tmp;做点什么;popd
,但你答案的最后一部分似乎要好得多。谢谢。脚本运行的方式都在一行中,比如说
pushd/tmp;做点什么;popd
,但你答案的最后一部分似乎要好得多。谢谢。您不能
Dir.chdir('/bin/bash')
,因为
/bin/bash
不是目录,而是可执行文件的名称
chdir('/bin')
会起作用您不能
Dir.chdir('/bin/bash')
,因为
/bin/bash
不是目录,而是可执行文件的名称
chdir('/bin')
可以工作