V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
doraemon0711
V2EX  ›  问与答

想问个关于 Linux 命令的问题

  •  
  •   doraemon0711 · 2019-03-23 22:35:17 +08:00 · 1300 次点击
    这是一个创建于 1853 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟刚学 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 却不可执行了呢?

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

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

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

    你可以参考 BSD 的
    https://www.freebsd.org/cgi/man.cgi?query=ls
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3452 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 04:49 · PVG 12:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.