'chmod u+x' против 'chmod +x'

В чем разница между chmod u+x и просто chmod +x? Я видел массу руководств, в которых говорится, как использовать u+x чтобы сделать скрипты исполняемыми. Однако, опуская u похоже, это не имеет никакого эффекта.

Справочная страница из chmod покрывает это.

  • u расшифровывается как пользователь.
  • g расшифровывается как группа.
  • o выступает за других.
  • a выступает за всех.

Это означает, что chmod u+x somefile предоставит только владельцу этого файла разрешения на выполнение, тогда как chmod +x somefile это то же самое, что и chmod a+x somefile.

На справочной странице chmod написано:

Формат символьного режима - это [ugoa...][[+-=][rwxXstugo...]...][,...]. Может быть задано несколько символьных операций, разделенных запятыми.

Комбинация букв "ugoa" определяет, доступ каких пользователей к файлу будет изменен: пользователя, которому он принадлежит (u), других пользователей в группе файла (g), других пользователей, не входящих в группу файла (o), или всех пользователей (a). Если ни один из них не задан, эффект будет таким, как если бы был задан 'a', но биты, установленные в umask, не затрагиваются.

Требования

Прежде всего, я предлагаю вам прочитать эти вопросы и ответы, приведенные ниже:

Это поможет вам понять все необходимые части, которые вам нужно знать.


Короткая версия

  • chmod +x равно chmod ugo+x (На основе umask значение)
  • chmod a+x равно chmod ugo+x (Без учета umask значение)

Объяснение

Результатом chmod a+x легко ли установить исполняемый бит для всех (владельца, группы, других), не так ли?

Однако с chmod +x это немного сложно, там написано, что используйте umask значение и на основе этого значения добавьте x для всех, кому это позволено.

Так что, если umask из моего окружения является 0002:

$ umask0002$ umask -Su=rwx,g=rwx,o=rx

Это добавит x для пользователя (владельца), группы и других, в этой ситуации (которая является ситуацией по умолчанию для большинства систем) это точно так же, как chmod ugo+x или то же самое, что и chmod a+x, или в более подробной форме:

chmod u+x,g+x,o+x

Можете ли вы определить связь между chmod u+x,g+x,o+x и выход из umask -S?

Теперь давайте изменим umask из текущей оболочки в 0003:

$ umask 0003$ umask0003$ umask -Su=rwx,g=rwx,o=r

Как вы можете видеть, теперь только владелец и группа получат исполняемый бит, а не остальные. Это означает chmod +x теперь равно chmod u+x,g+x или chmod ug+x.


Время вопросов!

Что произойдет, если я сбегу chmod +w в файле после настройки umask к 0003?

То же, что и раньше, это влияет только на user и group файла, потому что 3 также удаляет разрешение на запись (2).


Бонус

Это имеет тот же эффект, когда вы удаляете что-то вроде chmod -w:

$ mkdir test$ stat -c %A testdrwxrwxr-x
$ umask0002
$ chmod +w test$ stat -c %A testdrwxrwxr-x
$ chmod a+w test$ stat -c %A testdrwxrwxrwx
$ chmod -w testchmod: test/: new permissions are r-xr-xrwx, not r-xr-xr-x
$ stat -c %A testdr-xr-xrwx

Просто делаю +x применит его ко всем флагам: [u]ser, [g]roup, [o]thers.

Тип man chmod для получения дополнительной информации.

chmod u+x сделает файл исполняемым для вашего пользователя (он добавит его только для вашего пользователя, хотя он может быть уже исполняемым владельцем группы или "другим").

chmod +x или chmod a+x ('все плюс исполняемый бит') делает файл исполняемым всеми.

Если вы сделаете это с каталогом, вместо этого он станет доступным для поиска в каталоге. Т.е. вы можете перечислить содержимое каталога, на который у вас есть разрешение +x.

  • chmod u+x file означает добавление исполняемого бита к владельцу файла, игнорируя при этом umask (Ваш мод будет установлен, без вопросов).

  • chmod +x file означает добавление исполняемого бита владельцу, группе и другим лицам при рассмотрении umask (Сначала проверьте с umask затем примените моды, это может иметь разные эффекты в зависимости от значения umask ).


давайте создадим два файла:

$ touch file1 file2$ ls -l file1 file2-rw-rw-rw- 1 ravexina ravexina 0 Aug  5 01:45 file1-rw-rw-rw- 1 ravexina ravexina 0 Aug  5 01:45 file2

Теперь я устанавливаю umask на "111", чтобы удалить исполняемые биты: umask 111.

$ chmod u+x file1$ chmod  +x file2
$ ls -l file1 file2-rwxrw-rw- 1 ravexina ravexina 0 Aug  5 01:47 file1-rw-rw-rw- 1 ravexina ravexina 0 Aug  5 01:47 file2

Как вы можете видеть, chmod проигнорировал umask и файл1 получил исполняемый бит для своего владельца, однако второй ничего не сделал, потому что он учитывает значение umask.