Ошибка одной строки в Ruby из-за директории - PullRequest
2 голосов
/ 18 ноября 2011

У меня рубиновый однострочный ruby1.9 -ine '#some statement' src/**.Я предположил, что, как и Perl, Ruby пропускает каталоги (ну, вот как я это помню).Но я получаю эту ошибку e:1:in 'gets': Is a directory.Помимо предоставления списка файлов, есть ли быстрый способ обойти это?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Я не думаю, что он когда-либо пропускал каталоги, по крайней мере, даже 1.8.6 этого не делает. Так что я полагаю, что единственный быстрый способ - это дать ему список файлов или манипулировать ARGV, но это вряд ли будет правильным однострочником.

Примерно так:

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

Так что, да, правильно составить список файлов, кажется, более удачное решение.

1 голос
/ 18 ноября 2011

Если вы хотите использовать только файлы рекурсивно, тогда find (1) будет лучшим выбором:

find ./src -type f | ruby1.9 -ne '#some statement'
1 голос
/ 18 ноября 2011

Я полагаю, что ваше предположение на самом деле касается обработки оболочки *1001* **. Оболочка интерпретирует неэкранированные метасимволы в командах.

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
...