使用通配符时,只有一个文件是 运行 in rails runner
When using wildcard, only one file is ran in rails runner
我正在使用 rails 运行ner,我想 运行 一个文件夹中的多个脚本。
这是我的文件结构...
$ ls db/test/
de_test.rb
fr_test.rb
ja_test.rb
....
de_test.rb
puts "DE"
fr_test.rb
puts "FR"
ja_test.rb
puts "JA"
现在如果我运行:
$ bundle exec script/rails runner -e production db/test/de_test.rb
DE
$ bundle exec script/rails runner -e production db/test/fr_test.rb
FR
$ bundle exec script/rails runner -e production db/test/ja_test.rb
JA
$ bundle exec script/rails runner -e production db/test/*test.rb
DE
为什么 db/test/*test.rb
运行 没有所有文件?我该怎么做才能解决这个问题。
这是在 RHEL 上。
Bash glob 只是 shorthand 用于一次写入多个文件名参数:
这个:
bundle exec script/rails runner -e production db/test/*test.rb
将与您编写的内容完全相同:
bundle exec script/rails runner -e production db/test/de_test.rb db/test/fr_test.rb db/test/ja_test.rb
缺少文档,但这很可能只是 运行 de_test.rb
与其他文件一起作为附加的命令行参数。这就是您只看到 DE
的原因。
您想做的是 运行 每个文件一个命令,即:
bundle exec script/rails runner -e production db/test/de_test.rb
bundle exec script/rails runner -e production db/test/fr_test.rb
bundle exec script/rails runner -e production db/test/ja_test.rb
您可以使用 for 循环执行此操作:
for file in db/test/*test.rb;
do
bundle exec script/rails runner -e production "$file";
done
(如果您愿意,可以将所有内容放在一行中)
我们来分析一下为什么会这样。我从 rails/runner
任务中删除了所有内容。通过说一切,我的意思是与您的问题无关的事情。您可以在您的计算机中查看此代码。
require 'optparse'
code_or_file = nil
puts ARGV
puts code_or_file
if ARGV.first.nil?
ARGV.push "-h"
end
ARGV.clone.options do |opts|
opts.order! { |o| code_or_file ||= o } rescue retry
end
puts code_or_file
因此 puts ARGV
将显示每个满足您 db/test/*test.rb
的文件。
行puts code_or_file
将显示空行(这是正常的,因为变量有nil
值)
最后一行 puts code_or_file
将打印 first 文件夹中 lexicographical order
.
的文件
那么为什么会这样呢?因为:
opts.order! { |o| code_or_file ||= o } rescue retry
简单地说,它取数组(文件列表)中的第一项。我的建议是rewrite/patchrails/runner
任务来解决你的问题。另一种方法是编写@that_other_guy提供的shell
脚本。
我正在使用 rails 运行ner,我想 运行 一个文件夹中的多个脚本。
这是我的文件结构...
$ ls db/test/
de_test.rb
fr_test.rb
ja_test.rb
....
de_test.rb
puts "DE"
fr_test.rb
puts "FR"
ja_test.rb
puts "JA"
现在如果我运行:
$ bundle exec script/rails runner -e production db/test/de_test.rb
DE
$ bundle exec script/rails runner -e production db/test/fr_test.rb
FR
$ bundle exec script/rails runner -e production db/test/ja_test.rb
JA
$ bundle exec script/rails runner -e production db/test/*test.rb
DE
为什么 db/test/*test.rb
运行 没有所有文件?我该怎么做才能解决这个问题。
这是在 RHEL 上。
Bash glob 只是 shorthand 用于一次写入多个文件名参数:
这个:
bundle exec script/rails runner -e production db/test/*test.rb
将与您编写的内容完全相同:
bundle exec script/rails runner -e production db/test/de_test.rb db/test/fr_test.rb db/test/ja_test.rb
缺少文档,但这很可能只是 运行 de_test.rb
与其他文件一起作为附加的命令行参数。这就是您只看到 DE
的原因。
您想做的是 运行 每个文件一个命令,即:
bundle exec script/rails runner -e production db/test/de_test.rb
bundle exec script/rails runner -e production db/test/fr_test.rb
bundle exec script/rails runner -e production db/test/ja_test.rb
您可以使用 for 循环执行此操作:
for file in db/test/*test.rb;
do
bundle exec script/rails runner -e production "$file";
done
(如果您愿意,可以将所有内容放在一行中)
我们来分析一下为什么会这样。我从 rails/runner
任务中删除了所有内容。通过说一切,我的意思是与您的问题无关的事情。您可以在您的计算机中查看此代码。
require 'optparse'
code_or_file = nil
puts ARGV
puts code_or_file
if ARGV.first.nil?
ARGV.push "-h"
end
ARGV.clone.options do |opts|
opts.order! { |o| code_or_file ||= o } rescue retry
end
puts code_or_file
因此 puts ARGV
将显示每个满足您 db/test/*test.rb
的文件。
行puts code_or_file
将显示空行(这是正常的,因为变量有nil
值)
最后一行 puts code_or_file
将打印 first 文件夹中 lexicographical order
.
那么为什么会这样呢?因为:
opts.order! { |o| code_or_file ||= o } rescue retry
简单地说,它取数组(文件列表)中的第一项。我的建议是rewrite/patchrails/runner
任务来解决你的问题。另一种方法是编写@that_other_guy提供的shell
脚本。