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

@c Copyright (C) 1994-2012 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 桁以上の数値モードの動作は、
そうしたビットを維持しないシステムでも使えるスクリプト向けである。
@sp 1
(訳注: 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 桁の数値指定をサポート
していればだが。)
