Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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单行因目录错误而失败_Ruby_Bash_Shell - Fatal编程技术网

Ruby单行因目录错误而失败

Ruby单行因目录错误而失败,ruby,bash,shell,Ruby,Bash,Shell,我有一个ruby单行程序ruby1.9-ine'#一些语句'src/**。我假设ruby会像perl一样跳过目录(我就是这么记得的)。但是我在“get”中得到了这个错误:是一个目录。除了给它一个文件列表之外,还有没有一个快速的方法来解决这个问题?我相信你的假设实际上是关于你的shell处理**的。shell解释命令中未转义的元字符 bash(1)默认情况下不会递归展开**。您需要为此行为设置globstar选项: $ ls -l /tmp total 20 drwx------ 2 sarnol

我有一个ruby单行程序
ruby1.9-ine'#一些语句'src/**
。我假设ruby会像perl一样跳过目录(我就是这么记得的)。但是我在“get”中得到了这个错误:是一个目录。除了给它一个文件列表之外,还有没有一个快速的方法来解决这个问题?

我相信你的假设实际上是关于你的shell处理
**
的。shell解释命令中未转义的元字符

bash(1)
默认情况下不会递归展开
**
。您需要为此行为设置
globstar
选项:

$ ls -l /tmp
total 20
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:43 keyring-9mdW7p
drwx------ 2 gdm     gdm     4096 2011-11-17 15:43 orbit-gdm
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:44 orbit-sarnold
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:46 plugtmp
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:43 ssh-ZriaCoWL2248
$ shopt -u globstar
$ echo /tmp/**
/tmp/keyring-9mdW7p /tmp/orbit-gdm /tmp/orbit-sarnold /tmp/plugtmp /tmp/ssh-ZriaCoWL2248
$ shopt -s globstar
$ echo /tmp/**
/tmp/ /tmp/keyring-9mdW7p /tmp/keyring-9mdW7p/control /tmp/orbit-gdm /tmp/orbit-sarnold /tmp/orbit-sarnold/linc-9a5-0-240e051029b41 /tmp/orbit-sarnold/linc-9ad-0-1b1412421b16c /tmp/plugtmp /tmp/ssh-ZriaCoWL2248 /tmp/ssh-ZriaCoWL2248/agent.2248

我不认为它曾经跳过过目录,至少1.8.6也没有。所以我想唯一快捷的方法就是给它一个文件列表,或者操纵ARGV,但它现在已经不再是一个合适的单行程序了

大概是这样的:

ruby -ne 'ARGV.delete_if{|s| File.ftype(s) == "directory"}; do_stuff_here' src/**

因此,是的,给它一个合适的文件列表似乎是更好的解决方案。

如果您只需要递归的文件,那么查找(1)将是您最好的选择:

find ./src -type f | ruby1.9 -ne '#some statement'

.. 虽然我的答案保留了输出中的目录。不幸的是,
find
没有通过管道传输它找到的文件(在我的系统上没有)。它只是打印它们你想显示文件内容,对吗?所以add-execcat:find./src-type f-execcat{}\|ruby1.9-ne'#一些声明'啊,我的错误,我把
-I
拿出来了。但是现在我得到了这个
ruby1.9:没有这样的文件或目录--(LoadError)
ough…并且单独制作
-I
,而不是
-ine
它是
-I-ne
-我得到了这个
-e:1:警告:无法对stdio进行就地编辑。我有种感觉,我不能在最后我只是做了一个适当的文件列表,所以
src/*
,然后,
src/*/*
等等。没有管道(因为管道不适合我),只有简单的ruby命令