Для исполняемого файла g+s
переопределяет идентификатор группы, под которой будет выполняться исполняемый файл (обычно он наследуется от родительского).
$ cp `which id` id-test
$ ./id-test
uid=1001(user1) gid=1001(group1) groups=1001(group1),2001(project1)
$ chgrp project1 id-test
$ chmod g+s id-test
$ ./id-test
uid=1001(user1) gid=1001(group1) egid=2001(project1) groups=1001(group1),2001(project1)
(egid - "эффективный идентификатор группы" - обычно такой же, как gid, "идентификатор группы", но здесь другой.)
Для каталога g+s
переопределяет идентификатор группы, который будет иметь новые файлы и каталоги (обычно он наследуется от создателя).
$ mkdir project
$ chgrp project1 file1
$ umask
0022
$ touch project/file1
$ ls -l project/file1
-rw-r--r-- 1 user1 group1 0 file1
$ chmod g+s project
$ touch project/file2
$ ls -l project/file2
-rw-r--r-- 1 user1 project1 0 file2
Возможно, вам все равно придется возиться с umask
для достижения наилучших результатов; что-то, по крайней мере, столь же разрешающее, как 0007
, требуется для совместного чтения, а что-то, по крайней мере, столь же разрешающее, как 0027
, требуется для совместного чтения.
$ umask 0077
$ touch project/file3
$ ls -l project/file3
-rw------- 1 user1 project1 0 file3
$ umask 0027
$ touch project/file4
$ ls -l project/file4
-rw-r----- 1 user1 project1 0 file4
$ umask 0007
$ touch project1/file5
$ ls -l project1/file5
-rw-rw---- 1 user1 project1 0 file5