想问个关于 Linux 命令的问题

2019-03-23 22:35:17 +08:00
 doraemon0711

小弟刚学 Linux,对命令的短选项和长选项有了些疑惑,是关于选项的参数设定问题
比如:
我想看一个文件 test 的用户 ID,

短选项,用 stat 命令和-c 来看的话
A1 stat -c %u test 可以执行,输出 1000
A2 stat -c%u test 可以执行,输出 1000
A3 stat -c=%u test 可以执行,输出=1000

长选项,用 stat 命令和--format 来看的话
B1 stat --format %u test 可以执行,输出 1000
B2 stat --format%u test 不可执行
B3 stat --format=%u test 可以执行,输出 1000

发现 A1 和 B1 都是一样的,A2 和 B2 一个可执行一个不可执行,A3 和 B3 输出的内容就不一样了
那么为什么会这样呢?
是短选项和长选项的区别决定的吗?
有哪种写法更规范之说吗?


之后我又试了下 ls 的--color,发现了和 stat 的--format 不一样的结果
C1 ls --color never 不可执行
C2 ls --colornever 不可执行
C3 ls --color=never 可以执行

为何 B1 可以执行,C1 却不可执行了呢?

1416 次点击
所在节点    问与答
8 条回复
msg7086
2019-03-23 22:39:19 +08:00
没有规范一说。程序怎么解析的就怎么写。tar 后面还可以不加横线直接写选项呢。
doraemon0711
2019-03-23 22:41:24 +08:00
@msg7086
谢谢回复,但是最后那个问题,为何 B1 能执行,C1 就不能执行呢?
nanaw
2019-03-23 22:47:42 +08:00
@doraemon0711 楼上正解。你看到的那些规范都是约定俗成的,并不是所有程序都严格遵守。不同的程序怎么用还是看手册
msg7086
2019-03-23 23:26:54 +08:00
@doraemon0711 因为 ls 程序没有解析 C1 格式。
0ZXYDDu796nVCFxq
2019-03-24 00:28:14 +08:00
以下说的都是约定俗成的

短选项只有一个字母,所以 -c%u 是能正确解析的
长选项的长度不确定,所以要用空格或者等号隔开

所以 ,你的例子里,A3 的 -c=%u 被识别到参数是 =%u 了
B2 无法识别到参数,因为没有分隔符
0ZXYDDu796nVCFxq
2019-03-24 00:32:25 +08:00
补充:
C1 是因为源代码里不支持长选项用空格分割,只支持等号分割
C2 更离谱了,要识别这种,代码逻辑复杂度得到什么程度,谁愿意维护这种代码……
doraemon0711
2019-03-24 00:49:41 +08:00
明白了,谢谢各位的回复
确实如果短选项只能有一个字母一切就说的通了,
不过长选项如果有的支持有的不支持,那么是不是都加等号比较好
0ZXYDDu796nVCFxq
2019-03-24 02:06:05 +08:00
其实都是 GNU 惯出的毛病
BSD 就规范多了

你可以参考 BSD 的
https://www.freebsd.org/cgi/man.cgi?query=ls

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/547851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX