[RUBY] La spécification d'autorisation de la méthode FileUtils est un nombre octal.

Je souhaite spécifier l'autorisation lors de la création d'un répertoire avec mkdir_p ...

À propos de mkdir_p

Créez le répertoire dir et tous ses répertoires parents.

Par exemple

require 'fileutils'
FileUtils.mkdir_p('/usr/local/lib/ruby')
Vérifiera tous les répertoires ci-dessous(Si non)Créer.

/usr
/usr/local
/usr/local/bin
/usr/local/bin/ruby

Citation https://docs.ruby-lang.org/ja/latest/class/FileUtils.html#M_MAKEDIRS

Essayez de créer en spécifiant une autorisation

Avec les commandes Linux. mkdir -p -m 755. / hoge1 / hoge2 / hoge3 / ruby rubis

test.rb


require 'fileutils'

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)

Merveille?

Exécutez immédiatement

$ ruby test.rb
$ ls -la
d-wxrw--wt    3 casix  staff     96 Jun 12 01:06 hoge1/

Non, évidemment l'autorité n'est pas 755 ...

J'ai lu le code source de mkdir_p

fileutils.rb


# File fileutils.rb, line 194
def mkdir_p(list, mode: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
  return *list if noop

  ...
end

Si vous lisez attentivement le traitement de l'argument mis en mode

mkdir -p #{mode ? ('-m %03o ' % mode) : ''}

une

#{mode ? ('-m %03o ' % mode) : ''}

Devrait être 755,

'-m %03o ' % mode

Si vous mettez 755 en mode

irb(main):001:0> mode = 755
=> 755
irb(main):002:0> '-m %03o ' % mode
=> "-m 1363 "

1363 est retourné

Cela signifie ...

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)
# ↓
# $ mkdir -p -m 1363 ./hoge1/hoge2/hoge3/ruby

Que c'était

L'argument doit être un nombre octal, pas un nombre décimal

'-m %03o ' % mode

# %Puisque 03o est émis sous la forme d'un nombre octal à 3 chiffres à 0
#En mode, le nombre obtenu en convertissant 755 en décimal(493)Mettre en

irb(main):001:0> mode = 0o755
=> 493
irb(main):002:0> '-m %03o ' % mode
=> "-m 755 "

Cela semble bon

Essayez de réparer

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 0o755)

# FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 0755)Mais k
$ ls -la
drwxr-xr-x    3 casix  staff     96 Jun 12 01:43 hoge1/

Il semble qu'il puisse être réglé avec 755!

Dans FileUtils, le paramètre d'autorisation était octal, quel que soit mkdir_p

Ce n'était pas limité à mkdir_p en premier lieu Toutes les méthodes qui peuvent spécifier l'autorisation avec FileUtils semblent avoir les mêmes spécifications

https://docs.ruby-lang.org/ja/latest/class/FileUtils.html#options

(Au fait, quand il commence à 0, il est facile d'oublier le fait que cela devient un nombre octal ...)

Recommended Posts

La spécification d'autorisation de la méthode FileUtils est un nombre octal.
L'ordre des modificateurs de méthode Java est fixe
[Ruby] Comptez un nombre pair dans un tableau en utilisant la méthode pair?
Quelle est la méthode pluck?
La méthode de la fonction primitive spécialisée IntFunction s'applique-t-elle ou applyAsInt?
[Ruby] Questions et vérification du nombre d'arguments de méthode
Quelle est la différence entre une action et une méthode d'instance?
Quelle est la méthode d'initialisation?
Méthode pour additionner le nombre d'années et obtenir la fin du mois
Méthode d'enquête lorsque le processeur du serveur exécutant java est lourd
'% 02d' Quel est le% de% 2?
À propos du rôle de la méthode initialize
Quel type de méthode est define_method?
Introduction de heartbeat-logger qui enregistre périodiquement le numéro de méthode / ligne en cours d'exécution
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
Comparer les éléments d'un tableau (Java)
Comment déterminer le nombre de parallèles
Quelle est la méthode principale en Java?
Quelle est la structure des données d'ActionText?
J'ai approfondi ma compréhension de la méthode de fusion
À propos du nombre de threads de Completable Future
[Java] Vérifiez le nombre d'occurrences de caractères
[Swift] Comment obtenir le nombre d'éléments dans un tableau (super basique)
Upcast (Java) qui peut réduire la quantité de changement lorsque la spécification est modifiée
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Si le produit total des n premiers nombres premiers plus 1 est un nombre premier