Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
如何在linux中更准确地检测一个文件是ruby脚本文件_Ruby_Linux_File Type - Fatal编程技术网

如何在linux中更准确地检测一个文件是ruby脚本文件

如何在linux中更准确地检测一个文件是ruby脚本文件,ruby,linux,file-type,Ruby,Linux,File Type,我知道extname是rb正在工作 我知道linuxfile命令在某些情况下是可以使用的 但所有这些都不够准确,无法确定一个文件是一个ruby脚本 编辑: 我想做的是:更准确地计算我写的ruby行 使用bash shell脚本,如下所示: find -name '*.rb' |xargs -n100 cat |grep -v '\s*#' |wc -l 但是,事实上,我写了一些可执行的ruby脚本,还有一些,例如。 .rake,GemfileCapfilejbuider等 谢谢使用ruby-c

我知道extname是
rb
正在工作

我知道linux
file
命令在某些情况下是可以使用的

但所有这些都不够准确,无法确定一个文件是一个ruby脚本

编辑: 我想做的是:更准确地计算我写的ruby行 使用bash shell脚本,如下所示:

find -name '*.rb' |xargs -n100 cat |grep -v '\s*#' |wc -l
但是,事实上,我写了一些可执行的ruby脚本,还有一些,例如。
.rake
Gemfile
Capfile
jbuider


谢谢

使用
ruby-c
。从手册页:

-c使Ruby检查脚本的语法并退出
这将告诉您该文件是否是有效的Ruby脚本,而不执行它。如果是,则将“Syntax OK”打印到STDOUT并以状态码0退出;否则,它将向STDERR打印一个语法错误,并以非零代码退出。(当然,您可以使用I/O重定向抑制消息,例如
&>/dev/null


当然,误报是可能的(一个文件是有效的Ruby并不一定意味着它是一个Ruby脚本),但除了非常短的文件之外,不太可能。从手册页:

-c使Ruby检查脚本的语法并退出
这将告诉您该文件是否是有效的Ruby脚本,而不执行它。如果是,则将“Syntax OK”打印到STDOUT并以状态码0退出;否则,它将向STDERR打印一个语法错误,并以非零代码退出。(当然,您可以使用I/O重定向抑制消息,例如
&>/dev/null


当然,误报是可能的(一个文件是有效的Ruby并不一定意味着它是一个Ruby脚本),但不太可能,除非是非常短的文件。

你想要的是不可能的。例如,至少在Ruby、PHP、Scala和Perl中,以下是一个有效且语义相同的程序:

print("Hello");
它在Python中也是有效的,尽管在语义上略有不同:它打印一个换行符(即,它打印字符串
“Hello\n”
),而其他的则不打印(其他的打印
“Hello”
,没有换行符)

它在ECMAScript中至少在语法上是有效的,如果标准库中存在合适的
print
函数,它在语义上可能是等价的

它可能在更多的语言中有效,我能想到的有AmbientTalk、Atomy、CoffeeScript、Converge、Dart、Dylan、E、Elixir、Falcon、Fancy、Groovy、Hack、Io、Ioke、Julia、Lua、Monte、Neko、Pico、Pike和Seph。它也是一个有效的片段,虽然不是完整的程序,至少在PARL6、C、C++、Objul-C、Objul-C++、D、java、C中都是一个有效的片段。♯, 规格♯, 唱♯, M♯, Cω,X♯, 科特林、锡兰、铁锈和铁锈


除了询问编写它的人之外,没有办法知道这是否是一个Ruby程序。

你想要什么是不可能的。例如,至少在Ruby、PHP、Scala和Perl中,以下是一个有效且语义相同的程序:

print("Hello");
它在Python中也是有效的,尽管在语义上略有不同:它打印一个换行符(即,它打印字符串
“Hello\n”
),而其他的则不打印(其他的打印
“Hello”
,没有换行符)

它在ECMAScript中至少在语法上是有效的,如果标准库中存在合适的
print
函数,它在语义上可能是等价的

它可能在更多的语言中有效,我能想到的有AmbientTalk、Atomy、CoffeeScript、Converge、Dart、Dylan、E、Elixir、Falcon、Fancy、Groovy、Hack、Io、Ioke、Julia、Lua、Monte、Neko、Pico、Pike和Seph。它也是一个有效的片段,虽然不是完整的程序,至少在PARL6、C、C++、Objul-C、Objul-C++、D、java、C中都是一个有效的片段。♯, 规格♯, 唱♯, M♯, Cω,X♯, 科特林、锡兰、铁锈和铁锈


除了询问编写它的人之外,没有办法知道这是否是Ruby程序。

更准确是什么意思?您想确保该文件确实包含Ruby代码还是至少是一个有效的Ruby文件?@spickermann,linux
file
命令,将我的这么多Ruby文件识别为
ASCII text
C++源代码、ASCII text
。rb
扩展名将忽略某些特殊的可执行文件和其他文件。(例如耙子)你说的更准确是什么意思?您想确保该文件确实包含Ruby代码还是至少是一个有效的Ruby文件?@spickermann,linux
file
命令,将我的这么多Ruby文件识别为
ASCII text
C++源代码、ASCII text
。rb
扩展名将忽略某些特殊的可执行文件和其他文件。(例如耙子)酷!这正是我想要的。不过,对于某些特殊的文件,例如git压缩对象,ruby-c不起作用。例如╰─ $ ruby-c./.git/objects/pack/pack-ef0573228b2fa7437e0913240d5cd6e7eca853a9.pack语法可以,但这不是什么大问题,我可以跳过
.git
目录来避免这种情况。@zw963这很有趣。我会将
ruby-c
file
结合使用,或者使用另一种技术。@Jordon,是的,我想我也需要按照你的建议去做。由于
ruby-c./app/assets/images/favicon.ico Syntax OK
有点混乱,因此
ttf
文件的情况也一样,但是如果与
file+grep
组合识别为`text$`,它就像一个charmWe需要跳过
*.js
$cat 1.js(函数(){asdfsadfasdfasdfasdfasdfa})。调用(此);   $ ruby-C1.js语法正常
Yep。就像我说的,会有误报。酷!这正是我想要的。不过,对于某些特殊的文件,例如git压缩对象,ruby-c不起作用。例如╰─ $ ruby-c./.git/objects/pack/pack-ef0573228b2fa7437e0913240d5cd6e7eca853a9.pack语法正常,但这个不是