我使用以下2个命令创建0B文件并将其extn设置为644
touch filename.ext
chmod 777 filename.txt
我的问题是unix(korn shell)中是否有任何一个命令可以将这两个东西放在一起,也就是说创建一个具有所需权限的0B文件?
答案 0 :(得分:25)
install -m 777 /dev/null filename.txt
答案 1 :(得分:13)
对于bash
,只需将chmod
用于文件重定向和历史记录扩展:
chmod 777 filename.txt>>!#:2
对于ksh
和zsh
,您必须删除历史记录扩展(如上所示,可能还有其他方式)并使用:
chmod 644 filename>>filename
对于任何shell的脚本,你没有(并且实际上不需要)历史记录扩展,所以也可以使用上面的那些。
答案 2 :(得分:10)
首先,您不应该为777
权限设置任何内容。这是一个巨大的安全问题,并没有任何需要。出于这个问题的目的,我假设您要创建一个文件,其权限比默认值更安全,比如说600
。
使用大多数bash工具安全创建和更改文件权限没有一站式方法。即使是Paul's answer中棘手的重定向技巧,实际上也会在重置之前暂时创建一个具有默认权限的文件。除非创建程序在创建节点时向操作系统发送非常具体的请求,否则所有新文件都将使用设置的系统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
权限创建。
这将对shell中运行的所有命令保持有效,直到您关闭该shell或手动设置另一个值。如果您想使用此构造来运行单个命令(或者甚至是一小组命令),那么在子shell中隔离命令会很有用
$ (umask 077 ; touch test_file)
请注意,您放入parens中的任何其他内容都将使用该umask,但只要您关闭它,就会回到之前的环境中。
答案 3 :(得分:5)
您可以创建自己的命令:
create () {
touch "$1"
chmod "$2" "$1"
}
create filename.ext 644
答案 4 :(得分:3)
如果您要创建的文件不仅是空的,而且要同时具有内容和模式,则可以在bash中使用install
进行进程替换:
install -m 755 <(echo commands go here) newscript
<()
将输出放入一个临时文件(Process-Substitution)
答案 5 :(得分:1)
使用666权限创建文件的唯一原因是umask。所以如果你禁用umask:
umask 0
然后当您触摸文件时,它将自动以权限666结束。通常使文本文件可执行不是一个好主意。目录最终将获得777权限,并禁用umask。
chicks@freecandy /tmp $ umask
0022
chicks@freecandy /tmp $ touch x
chicks@freecandy /tmp $ mkdir xx
chicks@freecandy /tmp $ umask 0
chicks@freecandy /tmp $ touch y
chicks@freecandy /tmp $ mkdir yy
chicks@freecandy /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 :(得分:1)
touch filename.ext && chmod 777 $_
$ _是最新参数
但是正如其他人所说,777不是一个好主意
答案 7 :(得分:0)
由于Docker和Alpine,我想有很多人对在没有bash-ism的帮助下创建可执行的单行代码感兴趣。使用install
$ docker build -t temp - <<EOF
FROM alpine
RUN echo "date" | install -m 775 /dev/stdin /bin/now
CMD /bin/now
EOF
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine
---> d6e46aa2470d
Step 2/3 : RUN echo "date" | install -m 775 /dev/stdin /bin/now
---> Running in 95919b575638
Removing intermediate container 95919b575638
---> cd1fafd96ef3
Step 3/3 : CMD /bin/now
---> Running in 03b5c3ac7265
Removing intermediate container 03b5c3ac7265
---> 8f30b527dd29
Successfully built 8f30b527dd29
Successfully tagged temp:latest
$ docker run --rm temp
Thu Nov 12 07:44:24 UTC 2020
$ docker run --rm temp ls -la /bin/now
-rwxrwxr-x 1 root root 5 Nov 12 07:44 /bin/now
$ docker rmi temp
Untagged: temp:latest
Deleted: sha256:8f30b527dd29203b67c86290b34b0a29d3c98a48134609d0b1e2b89087a7d6e7
Deleted: sha256:cd1fafd96ef3084226c5f98f472e3e08bc9a9f0448cc3e68b6f1c192d12d778a
Deleted: sha256:e58c75acbf953a64d35089cf50e1c5b762601e1cb9d9d1d668e135f23ce1fe86