@c ===========================================================================
@c
@c This file was generated with po4a. Translate the source file.
@c
@c ===========================================================================
@c File mode bits

@c Copyright (C) 1994-2016 Free Software Foundation, Inc.

@c Permission is granted to copy, distribute and/or modify this document
@c under the terms of the GNU Free Documentation License, Version 1.3 or
@c any later version published by the Free Software Foundation; with no
@c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
@c Texts.  A copy of the license is included in the ``GNU Free
@c Documentation License'' file as part of this distribution.

各ファイルには、一組のファイル・モードビット (@dfn{file mode bits})
というものがあって、ユーザがそのファイルに対してどんなアクセスができるかを制御している。
モードビットは、シンボルによっても、8 進数によっても表すことができる。

@menu
* Mode Structure::           ファイル・モードビットの構成。
* Symbolic Modes::           ファイル・モードビットの覚えやすい表現。
* Numeric Modes::            ファイル・モードビットの 8 進数による表現。
* Operator Numeric Modes::   8 進数によるモードの追加、削除、絶対指定。
* Directory Setuid and Setgid::  ディレクトリの set-user-ID と set-group-ID。
@end menu

@node Mode Structure
@section ファイル・モードビットの構成

ファイル・モードビットには、二つの構成部分がある。
ファイルに対する通常のアクセスを制御するファイル許可属性ビット (@dfn{file permission bits})
と、若干のファイルのみに働く特殊モードビット (@dfn{special mode bits}) である。

ユーザがファイルに対して持つ許可 (訳注: アクセス権とも言う) には、
3 種類ある。

@enumerate
@item
@cindex read permission
ファイルを読み込む許可。ディレクトリに対しては、ディレクトリの中身をリストする許可になる。
@item
@cindex write permission
ファイルに書き出す (ファイルを変更する) 許可。ディレクトリに対しては、
そのディレクトリ中でファイルを作成したり、削除したりする許可になる。
@item
@cindex execute/search permission
ファイルを実行する (プログラムとしてそれを動かす) 許可。
ディレクトリに対しては、ディレクトリ中のファイルにアクセスする許可になる。
@end enumerate

ユーザにも 3 種類あり、ファイルに対する上記の操作のいづれについても、
それぞれ違った許可を持つことができる。

@enumerate
@item
ファイルの所有者。
@item
ファイルの所有グループに属するファイルの所有者以外のユーザ。
@item
それ以外の全員。
@end enumerate

@cindex owner, default
@cindex group owner, default
ファイルには、作成されるときに所有者とグループが割り当てられる。
たいていの場合、所有者はファイルを作成したユーザであり、
グループはファイルが存在するディレクトリのグループだが、
オペレーティングシステムやファイルが作成されるファイルシステム、ファイルの作成方法などによって違うこともある。
ファイルの所有者やグループは、@command{chown} や @command{chgrp}
コマンドを使って、変更することができる。

上に挙げた 3 種類の許可属性 3 組のほかに、ファイルのモードビットには三つの特殊モードビットが存在するが、
そうしたものは、実行ファイル (すなわち、プログラム) と --- ほとんどのシステムでは
--- ディレクトリにしか効果を持たない。

@enumerate
@item
@cindex set-user-ID
@cindex setuid
ファイルの実行時に、そのプロセスの実効ユーザ ID をファイルの所有者のものにする
(@dfn{set-user-ID bit} とか @dfn{setuid bit} と呼ばれる)。
若干のシステムでは、ディレクトリに set-user-ID ビットを付けると、
ファイルの実際の作成者が誰であれ、そのディレクトリ中で作成されるファイルの所有者が、
ディレクトリの所有者と同じになる。また、新しく作られるサブディレクトリに
set-user-ID ビットが付く。
@item
@cindex set-group-ID
@cindex setgid
ファイルの実行時に、そのプロセスの実効グループ ID をファイルのグループのものにする
(@dfn{set-group-ID bit} とか @dfn{setgid bit} と呼ばれる)。
ほとんどのシステムでは、ディレクトリに set-group-ID ビットを付けると、
ファイルの作成者がどんなグループに属していようとも、
そのディレクトリ中で作成されるファイルのグループが、ディレクトリのグループと同じになる。
また、新しく作成されるサブディレクトリに set-group-ID ビットが付く。
@item
@cindex sticky
@cindex swap space, saving text image in
@cindex text image, saving in swap space
@cindex restricted deletion flag
特権を持たないユーザ (訳注: 要するに、root 以外の一般ユーザ)
に対して、自分が所有するファイルやディレクトリを除き、
ディレクトリ中のファイルの削除や、名前の変更を禁じる。
これは、ディレクトリの削除制限フラグ (@dfn{restricted deletion flag})
と呼ばれ、@file{/tmp} のような、誰でも書き込めるディレクトリでよく見かけられる。

古いシステムの中には、通常ファイルにこのビットが付いていると、
プログラムのテキスト・イメージをスワップ・デバイスにセーブするものがある。
そうすることで、実行時にロードが速くなるわけだ。
こちらは、スティッキー・ビット (@dfn{sticky bit}) と呼ばれる。
@end enumerate

@c should probably say a lot more about ACLs... someday
上記のファイル・モードビットのほかに、ファイルシステムに固有のファイル属性が存在することがある。
たとえば、アクセス・コントロール・リスト (ACL) がそうだし、
ファイルが圧縮されているか否か、ファイルが変更可能か否か (変更不可属性)、
ファイルがダンプ可能か否か、といった属性が存在することもある。
そうした属性は、通常、ファイルシステム固有のプログラムを使って設定される。例を挙げよう。

@table @asis
@item ext2
GNU 及び GNU/Linux では、ext2 ファイルシステムに固有なファイル属性は、
@command{chattr} コマンドを使って設定される。

@item FFS
FreeBSD では、FFS ファイルシステムに固有なファイルフラグは、
@command{chflags} コマンドを使って設定される。
@end table

ファイルのモードビットがそのファイルに対するある操作を許可していたとしても、
それでもその操作に失敗することがある。その理由としては、次のようなことが考えられる。

@itemize
@item
ファイルシステムに固有な属性やフラグが、その操作を許可していない。

@item
ファイルシステムが読み込み専用でマウントされている。
@end itemize

たとえば、ファイルに変更不可属性が設定されていると、@code{chmod a+w FILE}
を直前に実行したとしても、ファイルを変更することはできない。

@node Symbolic Modes
@section シンボリックモード

@cindex symbolic modes
シンボリックモード (@dfn{Symbolic modes}) では、
ファイルのモードビットの変更を、1 文字からなるシンボルに対する操作として表現している。
シンボリックモードを使えば、ファイルのモードビットのすべてを変更することもできるし、その一部を選択して変更することもできる。
もしそうしたければ、変更前のモードビットの値に基づいて変更することも可能だ。
現在の @code{umask} に基づいて変更することも、多分できるはずである (@pxref{Umask and Protection})。

シンボリックモードの書式は、次のとおりである。

@example
@r{[}ugoa@dots{}@r{][}-+=@r{]}@var{perms}@dots{}@r{[},@dots{}@r{]}
@end example

@noindent
ここで @var{perms} は @samp{rwxXst} の内の 0 個以上の文字、または
@samp{ugo} の内の 1 個の文字である。

以下のセクションでは、シンボリックモードについて、演算子 (operator)
を始め、様々なことを詳しく説明する。

@menu
* Setting Permissions::         許可属性の基本操作。
* Copying Permissions::         存在する許可属性をコピーする。
* Changing Special Mode Bits::  特殊モードビット。
* Conditional Executability::   条件付きで実行属性の変更をする。
* Multiple Changes::            複数の変更をする。
* Umask and Protection::        umask の働き。
@end menu

@node Setting Permissions
@subsection 許可属性の設定

ファイルの許可属性に対するシンボルによる操作 (operation) の基本は、
あるタイプのユーザに対して、ファイルの、読み、書き、実行または検索を行うための許可属性を、
追加したり、削除したり、設定したりすることである。
そうした操作には、以下の書式を使用する。

@example
@var{users} @var{operation} @var{permissions}
@end example

@noindent
上の書式では、三つの部分を空白で区切って示しているが、見やすくするためにすぎない。
シンボリックモードの指定には空白があってはならない。

@var{users} の部分は、どのタイプのユーザの、ファイルに対するアクセス権を変更するかを示している。
この部分には、1 個以上の下記の文字を指定する (あるいは、何も指定しないでもよい。
その場合どうなるかは、「Umask と保険」セクションで説明している。
@pxref{Umask and Protection})。文字を 2 個以上指定した場合の順番に特別な意味はない。

@table @code
@item u
@cindex owner of file, permissions for
ファイルの所有者。
@item g
@cindex group, permissions for
ファイルの所有グループに属するファイルの所有者以外のユーザ。
@item o
@cindex other permissions
@samp{u} や @samp{g} 以外のすべてのユーザ。
@item a
すべてのユーザ。@samp{ugo} と同じ。
@end table

@var{operation} の部分は、対象となるユーザのファイルに対するアクセス権をどんなふうに変更するかを指示しており、
以下の記号の一つを使用する。

@table @code
@item +
@cindex adding permissions
@var{users} がそのファイルに対して、すでにどんな許可を持っているかにかかわりなく、
それに @var{permissions} を追加する。
@item -
@cindex removing permissions
@cindex subtracting permissions
@var{users} がそのファイルに対して、すでにどんな許可を持っているかにかかわりなく、
そこから @var{permissions} を削除する。
@item =
@cindex setting permissions
@var{permissions} を、そのファイルに対して @var{users} が持つ許可のすべてにする。
@end table

@var{permissions} の部分は、ファイルに対するどんなアクセス権を変更するかを指示しており、
通常は 0 個以上の下記の文字を指定する。@var{users} の部分と同様、文字を
2 個以上指定した場合の順番に特別な意味はない。@var{permissions}
の部分に何も指定しないことに意味があるのは、操作に @samp{=} 演算子を使用する場合だけである。
その場合、指定されたユーザは、そのファイルに対していかなるアクセス権も持たないことになる。

@table @code
@item r
@cindex read permission, symbolic
@var{users} の、そのファイルを読む権限。
@item w
@cindex write permission, symbolic
@var{users} の、そのファイルに書き込む権限。
@item x
@cindex execute/search permission, symbolic
@var{users} の、そのファイルを実行する権限。ディレクトリの場合は、
ディレクトリを検索する権限。
@end table

たとえば、ある通常ファイルについて、すべてのユーザに読み書きを許可するが、
その実行は許可しないならば、次のように指定する。

@example
a=rw
@end example

そのファイルの所有者以外のすべてのユーザから書き込み権限を取り上げるには、次のようにする。

@example
go-w
@end example

@noindent
上記の指定は、ファイルの所有者がファイルに対して持っているアクセス権には影響を及ぼさない。
また、所有者以外のユーザがそのファイルを読んだり、実行したりできるかどうかにも、影響を及ぼさない。

ファイルの所有者以外のすべてのユーザに対して、そのファイルに何をする権限も一切与えないためには、
以下のモードを使用すればよい。それでも、所有者以外のユーザは、
ファイルの存在するディレクトリに対する書き込み権限を持っていれば、
そのファイルを削除することができるだろうけれど。

@example
go=
@end example

@noindent
同じことを指定する別のやり方もある。

@example
og-rwx
@end example

@node Copying Permissions
@subsection 存在する許可属性のコピー

@cindex copying existing permissions
@cindex permissions, copying existing
ファイルの許可属性を、それが既に持っている許可属性を元にして指定することもできる。
そうするには、演算子の後ろに @samp{r}, @samp{w}, @samp{x}
という文字を続ける代わりに、@samp{u}, @samp{g}, @samp{o}
という文字を使用する。一例を挙げよう。

@example
o+g
@end example

@noindent
上記のモード指定は、ファイルのグループに属するユーザのアクセス権を、
その他のユーザがそのファイルに対して持っているアクセス権に追加する。
従って、仮にファイルの最初のモードが 664 (@samp{rw-rw-r--}) ならば、
上記のモード指定は、それを 666 (@samp{rw-rw-rw-}) に変更することになる。
ファイルの最初のモードが 741 (@samp{rwxr----x}) だったら、745 (@samp{rwxr--r-x})
になるだろう。@samp{-} と @samp{=} の演算子の働きも、同様である。

@node Changing Special Mode Bits
@subsection 特殊モードビットの変更

@cindex changing special mode bits
読み込み、書き出し、実行/検索に関するファイルの許可属性を変更できるだけではない。
特殊モードビットも変更することができる。特殊モードビットについては、
「ファイルのモードビットの構成」の節で簡単に説明している。@xref{Mode Structure}.

ファイルの実行時にユーザ ID をセットするように、ファイルのモードビットを変更するには、
シンボリックモードの @var{users} の部分に @samp{u} を使用し、
@var{permissions} の部分に@samp{s} を使用する。

ファイルの実行時にグループ ID をセットするように、ファイルのモードビットを変更するには、
シンボリックモードの @var{users} の部分に @samp{g} を使用し、
@var{permissions} の部分に @samp{s} を使用する。

ファイルの実行時にユーザ ID とグループ ID の両方をセットするようにするには、
シンボリックモードの @var{users} の部分に何も指定せず
(あるいは、@samp{a} を使用し)、 @var{permissions} の部分に @samp{s} を使用する。

削除制限フラグやスティッキー・ビットが有効になるように、ファイルのモードビットを変更するには、
シンボリックモードの @var{users} の部分に何も指定せず
(あるいは、@samp{a} を使用し)、@var{permissions} の部分に @samp{t} を使用する。

たとえば、あるプログラムに set-user-ID モードビットを設定するには、
次のモードを指定すればよい。

@example
u+s
@end example

そのプログラムから set-user-ID と set-group-ID の両方のモードビットを削除するには、
次のモードを指定する。

@example
a-s
@end example

削除制限フラグやスティッキー・ビットを設定するには、次のモードを指定する。

@example
+t
@end example

@samp{o+s} という組み合わせには、何の効果もない。GNU のシステムでは、
@samp{u+t} や @samp{g+t} という組み合わせにも、全く効果がなく、
また @samp{o+t} は、単なる @samp{+t} と同じ働きをする。

特殊モードビットの設定や変更では、@samp{=} はあまり役に立たない。
たとえば、こんな指定をしたとしよう。

@example
o=t
@end example

@noindent
上記のモードは、確かに、削除制限フラグやスティッキー・ビットを設定することはするが、
同時に、ファイルのグループに属していないユーザが、
そのファイルに対して、読み、書き、実行/検索の権限を持っていたとしても、
そうした権限をすべて削除してしまう。

set-user-ID や set-group-ID ビットがディレクトリに付いている場合の、
ほかの約束事については、「ディレクトリの Set-User-ID と Set-Group-ID
ビット」の節をご覧になっていただきたい。@xref{Directory Setuid and Setgid}.

@node Conditional Executability
@subsection 条件付きの実行属性変更

@cindex conditional executability
シンボルによる許可属性の指定には、もう一つ特別なタイプがある。@samp{x}
の代わりに、@samp{X} を使用すると、実行/検索の許可属性に変更があるのは、
ファイルがディレクトリである場合か、あるいは、(どのユーザかに)
すでに実行許可が付いていた場合だけになる。

一例を挙げよう。

@example
a+X
@end example

@noindent
上記のモードは、すべてのユーザにディレクトリを検索する許可、
または、ファイルを実行する許可を与えるが、後者については、どのユーザかが、
すでにそのファイルを実行できたならば、という条件が付く。

@node Multiple Changes
@subsection 複数の変更

@cindex multiple changes to permissions
シンボリックモードの書式は、これまでに述べてきたよりも、実際にはもっと複雑である (@pxref{Setting Permissions})。
ファイルのモードビットに対して、複数の変更を一度に行うには、二つの方法がある。

一つ目の方法は、シンボリックモードの @var{users} の部分の後ろに、複数の
@var{operation} と @var{permissions} を指定することである。

たとえば、こんなふうにだ。

@example
og+rX-w
@end example

@noindent
このモードは、ファイルの所有者以外のユーザに、読み込み許可を与え、
さらに、ファイルがディレクトリであるか、どのユーザかがすでに実行許可を持っていた場合には、実行/検索許可も与えている。
また、ファイルの所有者以外のユーザから、ファイルへの書き出し許可を取り上げている。
なお、この指定は、ファイルの所有者が持っている許可には影響を及ぼさない。
このモードは、以下の二つのモードと等価である。

@example
og+rX
og-w
@end example

複数の変更を行う二つ目の方法は、単純なシンボリックモードを
2 個以上、コンマで区切って指定することである。たとえば、

@example
a+r,go-w
@end example

@noindent
これは、すべてのユーザにそのファイルに対する読み込み許可を与え、
所有者以外のすべてのユーザから書き出し許可を削除している。もう一つ、例を挙げる。

@example
u=rwx,g=rx,o=
@end example

@noindent
こちらは、そのファイルに対するすべての許可ビットを明示的に設定している。
(ファイルのグループに属さないユーザには、ファイルに対する許可を一切与えていない。)

複数の変更を行う二つの方法を組み合わせて使うこともできる。

@example
a+r,g+x-w
@end example

@noindent
この指定は、すべてのユーザにファイルの読み込み許可を与え、
さらに、ファイルのグループに属するユーザには、実行/検索許可も与えているが、
書き出し許可は与えていない。上記のモードを指定する方法は、ほかにもいくつかあるだろう。
その一つを挙げておく。

@example
u+r,g+rx,o+r,g-w
@end example

@node Umask and Protection
@subsection Umask と保険

@cindex umask and modes
@cindex modes and umask
シンボリックモードの @var{users} の部分を省略すると、デフォルトの @samp{a}
が使用される (すべてのユーザが対象になる)。が、この場合、システム変数
@code{umask} で設定されている許可属性は、全く影響を受けない
(訳注: @code{umask} で許可しないことになっている許可属性は、
現在実際には許可になっていようと、不許可であろうと、@samp{-w} や @samp{+w}
といった @var{users} 部のない指定では、変更されないということ。
以下で例を挙げて説明している)。@code{umask} の値は、@code{umask}
コマンドで設定することができる。@code{umask} のデフォルトの値は、システムによって様々である。

@cindex giving away permissions
シンボリックモードで @var{users} の部分を省略するのは、@samp{+} 以外の操作では、
おおむね役に立たない。@var{users} の省略が @samp{+} で役に立つのは、その場合、
意図した以上の許可をファイルに付けてしまわないための、簡単にカスタマイズできる保険として、
@code{umask} が使用できるからである。

一例を挙げると、@code{umask} の値が 2 ということは、
ファイルの所有者でもなく、ファイルのグループにも所属していない一般ユーザに、
書き出し許可を与えないということである。その場合、

@example
+w
@end example

@noindent
というモードは、ファイルの所有者とファイルのグループに所属するユーザに、
書き出し許可を追加するが、それ以外のユーザには、書き出し許可を追加しない。それに対して、

@example
a+w
@end example

@noindent
というモードは、@code{umask} を無視して、ファイルへの書き出し許可を、
文字通りすべてのユーザに与えるのである。

@node Numeric Modes
@section 数値モード

@cindex numeric modes
@cindex file mode bits, numeric
@cindex octal numbers for file modes
シンボリックモードで指定する代わりに、モードを表す 1 個の 8 進数
(基数 8) を指定することもできる。この数値は常に 8 進数として解釈されるので、
C 言語の場合とは違って、先頭に @samp{0} を付ける必要はない。@samp{0055}
というモードは、@samp{55} というモードと同じなのだ。(とは言え、@samp{00055}
のような、5 桁以上のモードは、特別な扱いを受けることがある。
@xref{Directory Setuid and Setgid}.)

数値モードは、たいていの場合、対応するシンボリックモードより短くてすむが、
ファイルの変更前のモードビットを踏まえて指定することが、
普通はできないという制限がある。数値モードでは、絶対的な形で指定することしかできないのだ。
ただし、ディレクトリの set-user-ID ビットと set-group-ID ビットは、
この一般的な原則の対象外である。 @xref{Directory Setuid and Setgid}.
なお、演算子付き数値モードを使えば、ファイルの変更前のモードビットを踏まえた指定が可能になる。
@xref{Operator Numeric Modes}.

ファイルの所有者、ファイルのグループに所属する他のユーザ、それ以外の一般ユーザ、
この 3 種のユーザに与える許可属性には、それぞれ 3 ビットを要し、その 3 ビットは
1 個の 8 進数で表現される。三つの特殊モードビットにも、おのおの 1 ビットが必要であり、
こちらも一つにまとめて、もう一つの 8 進数として表現される。
各ビットの並び方は、最下位のビットから上位のビットへ向かって、次のようになっている。

@example
モードの  対応する
値        モードビット

          ファイルのグループに所属しない一般ユーザ:
   1      実行/検索
   2      書き出し
   4      読み込み

          ファイルのグループに所属する所有者以外のユーザ:
  10      実行/検索
  20      書き出し
  40      読み込み

          ファイルの所有者:
 100      実行/検索
 200      書き出し
 400      読み込み

          特殊モードビット:
1000      削除制限フラグ、またはスティッキー・ビット
2000      ファイルの実行時にグループ ID をセットする
4000      ファイルの実行時にユーザ ID をセットする
@end example

たとえば、数値モードの @samp{4755} は、シンボリックモードの @samp{u=rwxs,go=rx}
に当たり、数値モードの @samp{664} は、シンボリックモードの @samp{ug=rw,o=r}
に相当している。数値モードの @samp{0} は、シンボリックモードの @samp{a=} に相当する。

@node Operator Numeric Modes
@section 演算子付き数値モード

演算子付き数値モードは、@samp{-}, @samp{+}, @samp{=} を前に付けた数値モードである。
そうした演算子が表している意味は、シンボリックモードの場合と同じだ。
たとえば、@samp{+440} は、ファイルの所有者とグループに対する読み込み許可を有効にし、
@samp{-1} は、その他の一般ユーザに対する実行許可を無効にする。
また、@samp{=600} は、ファイルの所有者に対する読み込みと書き出しの許可を有効にするが、
それ以外のすべての許可を無効にする。
演算子付き数値モードは、シンボリックモードと組み合わせて使うことも可能だ。
両者の間はコンマで区切ればよい。一例を挙げると、@samp{=0,u+r}
は、すべての許可を無効にした上で、ファイルの所有者の読み込み許可だけを有効にする。

コマンド  @samp{chmod =755 @var{dir}} と @samp{chmod 755 @var{dir}}
の違いは、前者がディレクトリ @var{dir} の setuid と setgid
をクリアするのに対して、後者はそれをそのまま維持するという点にある。
@xref{Directory Setuid and Setgid}.

演算子付き数値モードは、GNU による拡張である。

@node Directory Setuid and Setgid
@section ディレクトリの Set-User-ID と Set-Group-ID ビット

ほとんどのシステムでは、ディレクトリに set-group-ID ビットが付いていると、
そのディレクトリ内で新しく作られるファイルは、ディレクトリと同じグループを継承し、
新しく作られるサブディレクトリは、親ディレクトリの set-group-ID ビットを継承する。
また、若干のシステムでは、ディレクトリの set-user-ID ビットが、
ディレクトリ内の新規ファイルの所有者と、新規サブディレクトリの set-user-ID
ビットに対して、同様の効果を持っている。
こうした仕組みによって、新しいファイルを共有するために @command{chmod} や
@command{chown} を使う必要が軽減し、ユーザにとってファイルの共有がやりやすくなっているのである。

ユーザの便宜のためのこうした仕組みは、ディレクトリの set-user-ID
ビットや set-group-ID ビットを拠り所にしている。もし、@command{chmod} や
@command{mkdir} が、ディレクトリのそうしたビットを常時クリアする仕様になっていたら、
この仕組みもそれほど便利ではなくなり、ファイルの共有が面倒なことになるだろう。
それ故、@command{chmod} などのコマンドは、原則としてディレクトリの
set-user-ID ビットや set-group-ID ビットを変更しないのである。
set-user-ID ビットや set-group-ID ビットを変更するには、
ユーザがシンボリックモードで明示的にそう指定するか、@samp{=755}
のような演算子付き数値モードを使用するか、数値モードでビットを立てるか、5 桁以上の
8 進数からなる数値モードでビットをクリアするか、そのどれかをやる必要がある。
set-group-ID ビットの継承をサポートしているシステムでの例を挙げよう。

@example
# 以下のコマンドは、サブディレクトリの set-user-ID ビットと
# set-group-ID ビットを変更しない。従って、デフォルトの値が
# 保持される。
mkdir A B C
chmod 755 A
chmod 0755 B
chmod u=rwx,go=rx C
mkdir -m 755 D
mkdir -m 0755 E
mkdir -m u=rwx,go=rx F
@end example

サブディレクトリの set-user-ID ビットや set-group-ID ビットを設定したかったら、
シンボリックモードや数値モードで明示的に指定しなければならない。たとえば、次のようにだ。

@example
# 以下のコマンドは、サブディレクトリに set-user-ID ビットと
# set-group-ID bits を付けようとしている。
mkdir G
chmod 6755 G
chmod +6000 G
chmod u=rwx,go=rx,a+s G
mkdir -m 6755 H
mkdir -m +6000 I
mkdir -m u=rwx,go=rx,a+s J
@end example

サブディレクトリの set-user-ID ビットや set-group-ID ビットを消去したかったら、
シンボリックモードで明示的にそう指定するか、演算子付き数値モードを使用するか、5 桁以上の
8 進数からなる数値モードで指定するかしなければならない。

@example
# 以下のコマンドは、ディレクトリ D の set-user-ID ビットと
# set-group-ID ビットをクリアしようとしている。
chmod a-s D
chmod -6000 D
chmod =755 D
chmod 00755 D
@end example

こうした動作は、GNU による拡張である。移植を考慮したスクリプトでは、
ディレクトリの set-user-ID ビットや set-group-ID ビットを立てたり、
クリアしたりするリクエストを当てにしない方がよい。
POSIX の規格で、そうしたリクエストを無視する実装が認められているからだ。
なお、GNU の許可属性指定における 4 桁以下の数値モードの動作は、ディレクトリの
set-user-ID ビットや set-group-ID ビットを維持するシステムで使うスクリプト向けであり、
5 桁以上の数値モードの動作は、そうしたビットを維持しないシステムでも使えるスクリプト向けである。

(訳注: 4 桁以下と 5 桁以上の数値によるモード指定の違いについて少し整理しておく。
数値によるモード指定は、原則として絶対的な指定である。
たとえば、755 と指定すれば、755 に対応するモードビットだけが立てられ、
それ以外のビットは 0 になる。ただし、ディレクトリの set-user-ID ビットと
set-group-ID ビットについてだけは、話がもう少し複雑である。
4 桁以下の数値による指定の場合、ディレクトリの set-user-ID ビットや
set-group-ID ビットを維持するシステムでは、
そうしたビットはデフォルトや現在の状態が引き継がれるのだから、
ユーザがディレクトリの set-user-ID ビットや set-group-ID
ビットを数値によって指定しても、それは絶対的な指定にならない。
デフォルト値や現在値に対する追加にしかならないのである。
当然のこととして、この方法では消去もできない。それに対して、5 桁以上の数値による指定の場合は、
どんなシステムでも、すべてのモードビットについて、ユーザの指定は絶対指定になる。
従って、こちらなら、ディレクトリの set-user-ID ビットや set-group-ID
ビットの選択的な設定や消去もできるのである。もちろん、お使いの @command{chmod}
のバージョンが、5 桁の数値指定をサポートしていればだが。)
