Единая команда для создания файла и установки его разрешения

Я использую следующие 2 команды для создания 0B файла и установки его extn в 644

touch filename.ext
chmod 777 filename.txt

Мой вопрос заключается в том, есть ли какая-либо одна команда в unix (оболочка korn), которая будет делать две вещи вместе, то есть создать файл 0B с желаемым разрешением?

Ответ 1

install -m 777 /dev/null filename.txt

Ответ 2

Для bash просто используйте chmod с перенаправлением файлов и расширением истории:

chmod 777 filename.txt>>!#:2

Для ksh и zsh вам нужно отказаться от расширения истории (как показано выше, могут быть другие способы) и использовать:

chmod 644 filename>>filename

Для скриптов любой оболочки у вас нет (и действительно не нужно) расширения истории, поэтому используйте вышеприведенную там.

Ответ 3

Прежде всего, вы НИКОГДА не должны устанавливать что-либо для 777 разрешений. Это огромная проблема безопасности, и в этом нет необходимости. Для целей этого вопроса я предполагаю, что вы хотите создать файл с более безопасными разрешениями, чем значения по умолчанию, скажем 600.

Не существует единого способа безопасного создания и изменения разрешений файла с использованием большинства инструментов bash. Даже сложный трюк перенаправления в ответе Павла на самом деле мгновенно создает файл с разрешениями по умолчанию перед их сбросом. Все новые файлы создаются с использованием любого значения umask системы, если программа создания не отправляет очень специфические запросы в операционную систему во время создания узла. Маска из 133 распространена, что означает, что ваши файлы создаются с 644 разрешениями из коробки.

Помимо использования команды chmod для установки прав доступа к файлу после создания файла, вы также можете сообщить системе, какие значения по умолчанию вы хотите использовать с помощью команды umask.

$ umask 077
$ touch test_file
$ ls -l test_file
-rw------- 1 user group 0 Jan 24 22:43 test_file

Вы заметите, что файл был создан с 600 правами доступа.

Это останется в силе для всех команд, запущенных в оболочке, пока вы не закроете эту оболочку или вручную не установите другое значение. Если вы хотите использовать эту конструкцию для запуска одной команды (или даже небольшого набора из них), может быть полезно изолировать команды в подоболочке

$ (umask 077 ; touch test_file)

Обратите внимание, что все, что вы помещаете внутри parens, будет использовать этот umask, но как только вы его закроете, вы вернетесь в свою предыдущую среду.

Ответ 4

Вы можете создать свою собственную команду:

create () {
    touch "$1"
    chmod "$2" "$1"
}

create filename.ext 644

Ответ 5

Единственная причина, по которой ваши файлы не созданы с разрешениями 666 сразу же - это umask. Так что, если вы отключите Umask:

umask 0

затем, когда вы дотронетесь до файла, он автоматически получит права 666. Не было бы хорошей идеей сделать текстовые файлы исполняемыми обычно. Каталоги получат разрешение 777 с отключенным umask.

[email protected] /tmp $ umask
0022
[email protected] /tmp $ touch x
[email protected] /tmp $ mkdir xx

[email protected] /tmp $ umask 0
[email protected] /tmp $ touch y
[email protected] /tmp $ mkdir yy

[email protected] /tmp $ ls -ld x xx y yy                                                                                  
-rw-r--r-- 1 chicks chicks  484 Jan 24 14:37 x
drwxr-xr-x 2 chicks chicks 4096 Jan 24 14:37 xx
-rw-rw-rw- 1 chicks chicks    0 Jan 24 14:37 y
drwxrwxrwx 2 chicks chicks 4096 Jan 24 14:37 yy

Ответ 6

@MiliBoy Ваше решение работает нормально и действительно просто.

Ответ 7

просто

touch filename.txt && chmod 755 filename.txt