【问题标题】:Does the dash prefix have any effect on the behavior of `ar`?破折号前缀对 ar 的行为有任何影响吗?
【发布时间】:2017-08-02 00:47:30
【问题描述】:

ar 实用程序的手册页中,我看到以下行。

如果你愿意,你可以以第一个命令行参数开头 破折号。

但是,在手册页的其他任何地方都没有进一步提及破折号。由于我见过 ar 带有和不带有破折号的命令,这就留下了未回答的问题。

在第一个命令行参数前加上 - 有什么影响(如果有的话)?

此外,如果我想保持跨系统的可移植性,拥有- 还是不拥有- 是否更安全?

【问题讨论】:

    标签: unix static-libraries unix-ar


    【解决方案1】:

    就 GNU binutils 中的 ar 而言,不使用破折号对减慢处理启动速度的影响非常小。

    如果您检查该野兽的源代码,您会在启动时很早就看到使用以下代码调用decode_options()

    /* Convert old-style tar call by exploding option element and rearranging
       options accordingly. */
    
    if (argc > 1 && argv[1][0] != '-')
    {
        int new_argc;       /* argc value for rearranged arguments */
        char **new_argv;    /* argv value for rearranged arguments */
        char *const *in;    /* cursor into original argv */
        char **out;         /* cursor into rearranged argv */
        const char *letter; /* cursor into old option letters */
        char buffer[3];     /* constructed option buffer */
    
        /* Initialize a constructed option.  */
    
        buffer[0] = '-';
        buffer[2] = '\0';
    
        /* Allocate a new argument array, and copy program name in it.  */
    
        new_argc = argc - 1 + strlen (argv[1]);
        new_argv = xmalloc ((new_argc + 1) * sizeof (*argv));
        in = argv;
        out = new_argv;
        *out++ = *in++;
    
        /* Copy each old letter option as a separate option.  */
    
        for (letter = *in++; *letter; letter++)
        {
            buffer[1] = *letter;
            *out++ = xstrdup (buffer);
        }
    

    因此,如果您提供旧式选项,例如 ar pax diablo,它会在继续之前自动将其转换为 ar -p -a -x diablo。顺便说一句,pax 可能 不是 一个有效的选项集,我刚刚使用它是因为我懒得去看man 页面 - 但显然我没有问题花费大量时间解释我的决定:-)

    那么就最大可移植性而言,使用非- 参数似乎会更好,因为GNU ar 将同时处理新形式,而旧的@987654331 @ 变体很可能无法处理新表单。

    但是,这可能只是我的 CDO(a) 倾向,我会继续使用新形式,假设我真的不想支持这么旧的系统他们没有最新的 GNU 东西。


    (a) 就像强迫症一样,但以正确的方式排序:-)

    【讨论】:

    • 我认为不处理 - 选项的 ar 版本必须是真正旧的——比如早于 System V Unix,即 80 年代早期或70年代。与tar 类似。如果我真的在狡辩,我会注意到它不是使用破折号来减慢速度,而不是使用破折号——但我最初的印象是你的回答暗示了相反的情况。
    • @Jonathan,是的,这样可以很容易地阅读。已经澄清了。
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2017-11-10
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多