我的经验是,尝试使用空字符串文件名执行任何操作都会导致找不到文件 ( ENOENT
),包括ls -ld ''
,touch ''
或mkdir ''
. 但我只能尝试 ext4。
虽然这对我来说看起来很合乎逻辑,但 Posix 中是否有什么东西会禁止这样做呢?
我的经验是,尝试使用空字符串文件名执行任何操作都会导致找不到文件 ( ENOENT
),包括ls -ld ''
,touch ''
或mkdir ''
. 但我只能尝试 ext4。
虽然这对我来说看起来很合乎逻辑,但 Posix 中是否有什么东西会禁止这样做呢?
为什么分别选择was 和-H
in以及for ?-L
--dereference-command-line
--dereference
ls
du
我猜想-H
和-L
被认为不太常用,因此可以在多个实用程序中使用而不会发生冲突。如果没有好的历史原因,也许有人有好的助记符。
为什么 XCU 是“Shell and Utilities”的缩写,而 XSH 是“System Interfaces”的缩写?
POSIX 分为 4 个主要卷,全文使用缩写 XBD、XSH、XCU 和 XRAT,分别代表“基本定义”、“Shell 和实用程序”、“系统接口”和“基本原理”。第一个和最后一个缩写是有道理的,但“Shell and Utilites”甚至不包含“H”,而且“System Interfaces”也不包含“C”或“U”。就其价值而言,它们应该被称为 XSU 和 XSI,而不是 XSH 和 XCU。
想法?
我用来expand
将制表符扩展到空格。对于utf8
文件expand
不能正常工作。例如,inć\ta
选项卡扩展到 6 个空格,而 ina\ta
扩展到 7 个空格。
如何使其适用于utf8
文件?
假设我想要一个目录,里面创建的所有文件和目录都具有该目录的组所有者的组权限,默认权限为770。使用 posix ACL 非常简单
#create a dir..
mkdir proof
#inherit group permission "video" in this example
chmod g+s proof/
chgrp video proof/
#with setfacl make the default group with rxw permissions
setfacl -d -m g:video:rwx proof
#other are not allowed
setfacl -d -m o:--- proof/
chmod o-x proof
#give the acl
setfacl -m g:video:rwx proof
现在我在目录证明中创建一个文件和一个目录..
mkdir try1
drwxrws---+ 2 myuser video 4,0K feb 23 01:26 try1
touch file1
-rw-rw----+ 1 myuser video 0 feb 23 01:29 file1
如您所见,我得到了我想要的,目录中的所有文件都继承了权限,并将“video”组作为组所有者。这在 Linux(ext4 上的 posix acl、btrfs 等)和 Solaris (ufs) 上是可能的。
现在的问题是..如何使用在 Solaris 上使用 nfsv4 acl 的 zfs 来做到这一点?我试过在 zfs Solaris 11 主机中制作另一个目录“证明”(当然制作了 chmod g+s)
chmod A=owner@:read_attributes/read_data/execute/list_directory/read_data/write_data/append_data/execute/add_file/add_subdirectory:fd:allow,group:video:read_attributes/read_data/execute/list_directory/read_data/write_data/append_data/execute/add_file/add_subdirectory:fd:allow,everyone@:read_attributes/read_data/execute/list_directory/read_data/write_data/append_data/execute/add_file/add_subdirectory:fd:deny proof
但结果是..
mkdir newdir
drwxr-sr-x+ 2 myuser video 2 23 feb 02.33 newdir
:|
如何获取posix acl的相同内容?谢谢
是否可以插入新行以排列文件的内容?
我有:
1:1 Lorem ipsum dolor sit amet consectetur 1:1 This is sample text of varying length.
adipiscing elit. 1:2 This is another paragraph in this file.
1:2 Vivamus integer non suscipit taciti mus Yet another sentence in this paragraph.
etiam at primis tempor sagittis. 1:3 Another paragraph can be found here!
如何适当地添加空格以使数字对齐?
预期输出:
1:1 Lorem ipsum dolor sit amet consectetur This is sample text of varying length.
adipiscing elit.
1:2 Vivamus integer non suscipit taciti mus This is another paragraph in this file.
etiam at primis tempor sagittis. Yet another sentence in this paragraph.
1:3 Another paragraph can be found here!
编辑:由于线条会排列,因此无需重复数字,因此可以将其删除。
POSIX 合规性是首选。
mklement0 中关于 POSIX 兼容脚本和获取完整路径的讨论中的单行代码。它失败了 ShellCheck。删除空间会导致它不再工作。
https://stackoverflow.com/questions/29832037/how-to-get-script-directory-in-posix-sh
dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
^-- SC1007: Remove space after = if trying to assign a value (for empty string, use var='' ... ).
删除CDPATH=
ShellCheck 传递的结果,它似乎仍然有效,但是......
CDPATH= 前缀取代了原始命令中的 > /dev/null:$CDPATH 设置为空字符串,以确保 cd 永远不会回显任何内容。
看起来是需要的。那么,有没有办法让这个通过ShellCheck呢?还是直接忽略?
我是find
尝试与 POSIX(以及许多流行的扩展)兼容的替代品的作者。最近我注意到我的实用程序的行为与其他实现之间存在差异find
,我想知道 POSIX 是否允许我的行为,或者我是否需要更改它。
$ find . -exec /no/such/file {} \;
find: ‘/no/such/file’: No such file or directory
$ echo $?
0
$ bfs . -exec /no/such/file {} \;
bfs: error: .: -exec /no/such/file: No such file or directory.
$ echo $?
1
在这种情况下,至少 GNU、busybox 和 FreeBSD find 都具有退出状态 0。execv()
我的实现将错误从ed 子级传播fork()
到父级,而其他实现似乎直接从子级打印错误而不告诉父级。
我之所以问这个问题,而不是仅仅改变行为以匹配其他问题,是因为使用posix_spawn()
. 的实现posix_spawn()
被允许将execv()
错误传播到errno
父级中,例如glibc
,musl
两者都这样做。似乎无法判断错误是发生在 之前还是之后fork()
,并且可能来自fork()
(例如ENOMEM
)之前的错误应该导致非零退出状态。
我已经阅读了POSIX 规范find
,但这里的细节很简单。但是,我听说其他地方记录了其他可能相关的规则。例如,我听说如果一个实用程序打印到标准错误,它也必须以非零退出代码退出,这似乎暗示其他find
s 不兼容。但我不确定那个措辞在哪里,或者它是否真的存在。
编辑以澄清我的问题:
POSIX 说:
如果 <newline> 跟在(未加引号的)<backslash> 之后,shell 应将其解释为行继续。<backslash> 和 <newline> 应在将输入拆分为标记之前删除。
然而,dash
或其他实现,首先标记化输入。结果,\<newline>
不被识别而是# this is a comment \
被丢弃。这种行为是否符合 POSIX?同样,POSIX 说在标记化之前应删除行继续。
下面的过程真的不符合 POSIX 吗?
"echo hello ... \<newline> ... bye"
\<newline>
并删除它们:"echo hello ... bye"
"echo"(discard ' ')"hello"(discard ' ')(discard "# ... bye")
在带有 dash-0.5.10.2-6 sh (dash) 的 Ubuntu 上,我们得到以下信息
$ cat /var/tmp/test.sh
echo hello # this is a comment \
echo bye
$ sh /var/tmp/test.sh
hello
bye
这是因为 # 之后的所有内容都被视为注释,并且 \ 之前的所有内容都被丢弃,因此 \<newline> 的行继续不起作用。
但是,POSIX“转义字符(反斜杠)”部分指出
<backslash> 和 <newline> 应在将输入拆分为标记之前删除。
并且由于# 的注释处理是在标记化中完成的,
echo hello # this is a comment \
echo bye
应该相当于
echo hello # this is a comment echo bye
这是否意味着 sh 不符合 POSIX 标准?或者在这种情况下,评论优先于行延续是否有一些理由?