Репликация символического режима chmod в Ruby без явного вызова системной команды - PullRequest
3 голосов
/ 06 декабря 2011

В системах Unix / Linux функция chmod поддерживает «символьные режимы», то есть вы можете делать то, что по существу является бит-арифметикой с разрешениями, например, chmod u+x ... является символической формой для добавления исполняемых прав доступа для пользователя. Функция chmod в Ruby's FileUtils поддерживает только абсолютную битовую маску в качестве разрешения, т. Е. Вы можете делать только FileUtils.chmod(0777, ...), но FileUtils.chmod('u+x', ...) не будет работать.

Я понял, что один из способов сделать это - просто вызвать команду system напрямую: system("chmod u+x ..."), но я бы предпочел хранить код в домене Ruby настолько, насколько это возможно, без порождения оболочек повсюду. В качестве альтернативы, я мог бы перебирать File объекты, File.stat их, получать их существующие битовые маски и изменять их индивидуально, но символические режимы будут поддерживать файловый шарик, который гораздо более лаконичен и менее подвержен ошибкам.

Кто-нибудь знает, есть ли способ сделать это более изящным способом?

1 Ответ

2 голосов
/ 06 декабря 2011

Какую версию Ruby вы используете?Посмотрите на документы 1.9.3 для FileUtils.chmod :

Изменяет биты разрешений в именованных файлах (в списке) на битовую комбинацию, представленную режимом.режим является символическим и абсолютный режим может быть использован.Абсолютный режим

FileUtils.chmod 0755, 'somecommand'
FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true

Символьный режим

FileUtils.chmod "u=wrx,go=rx", 'somecommand'
FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true
...