AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1169260
Accepted
mook765
mook765
Asked: 2019-08-29 20:16:27 +0800 CST2019-08-29 20:16:27 +0800 CST 2019-08-29 20:16:27 +0800 CST

这个 if-then 语句是什么意思?

  • 772

在我的系统中玩耍,我偶然发现

~$ echo $XDG_DATA_DIRS
/usr/share/ubuntustudio:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share

问自己为什么/usr/share在路径中有两次,我发现下面 /etc/alternatinves/x-session-manager的链接片段/usr/bin/startxfce4是负责任的:

#!/bin/sh
.
.
.
if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="/usr/share:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:/usr/share"
fi
export XDG_DATA_DIRS
.
.
.

当我看线

if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then

我很难理解这个 if 语句,对我来说,它看起来像是一个字符串的比较,第一个总是假的,第二个总是真的。

结合逻辑or,测试总是评估为true,所以我可以将行缩短到 if true; then或者我可以说我根本不需要 if 语句。

我的错误在哪里?还是这样写是为了迷惑像我这样的初学者?

command-line sh
  • 2 2 个回答
  • 239 Views

2 个回答

  • Voted
  1. Best Answer
    Melebius
    2019-09-01T21:40:02+08:002019-09-01T21:40:02+08:00

    你是对的,命令

    test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"
    

    始终返回 true (0)。

    看起来有问题的文件是从更通用的版本生成的,但生成方式不是最佳的。脚本应该每次都询问实际路径,或者只在生成的文件中保留相关分支。

    然而,这个特定的文件来自一个包——不是在你的机器上生成的。这很可能需要修复/改进……您可以在Xfce Bugzilla上提交错误(如果它还没有出现)或自己修复。您可以克隆Xfce4 会话的 Git 存储库,也可以使用 Xfce4 开发人员的邮件列表与他们取得联系。祝你改进代码好运!

    • 2
  2. mook765
    2019-09-02T17:42:48+08:002019-09-02T17:42:48+08:00

    该脚本/usr/bin/startxfce4似乎是由解析器生成的,我们可以看到,当我们查看源代码时,我们再看一下对应的代码片段:

    if test "x$XDG_DATA_DIRS" = "x"
    then
      if test "x@_datadir_@" = "x/usr/local/share" -o "x@_datadir_@" = "x/usr/share"; then
        XDG_DATA_DIRS="/usr/local/share:/usr/share"
      else
        XDG_DATA_DIRS="@_datadir_@:/usr/local/share:/usr/share"
      fi
    else
      XDG_DATA_DIRS="$XDG_DATA_DIRS:@_datadir_@"
    fi
    export XDG_DATA_DIRS
    

    在这里我们可以看到这个 if-block 的含义,开发人员XDG_DATA_DIRS通过解析脚本所需的路径并@_datadir_@用这个路径替换字符串来给 package-maintainers 添加自定义路径的机会。

    如果解析的路径在脚本运行时不包含在其中,这将完美地工作,但是如果我们解析在脚本运行时已经存在的路径,XDG_DATA_DIRS它将导致相同的路径出现两次。XDG_DATA_DIRSXDG_DATA_DIRS

    这可以通过不将标准 XDG 文件夹 ( /usr/share, /usr/local/share) 解析到脚本来避免,但我不知道这是否可能。

    另一种解决方案是将源代码更改为

    if test "x$XDG_DATA_DIRS" = "x"
    then
      if test "x@_datadir_@" = "x/usr/local/share" -o "x@_datadir_@" = "x/usr/share"; then
        XDG_DATA_DIRS="/usr/local/share:/usr/share"
      else
        XDG_DATA_DIRS="@_datadir_@:/usr/local/share:/usr/share"
      fi
    else
      if test "x@_datadir_@" != "x/usr/local/share" -a "x@_datadir_@" != "x/usr/share"; then
        XDG_DATA_DIRS="$XDG_DATA_DIRS:@_datadir_@"
      fi
    fi
    export XDG_DATA_DIRS
    

    那将仅涵盖目录/usr/share,/usr/local/share尽管确实应该检查是否@_datadir_@已经存在XDG_DATA_DIRS,但是我不知道该由谁来做,我的知识到此为止。

    此外:

    这同样适用于脚本的这一部分:

    if test "x$XDG_CONFIG_DIRS" = "x"
    then
      if test "x@_sysconfdir_@" = "x/etc"; then
        XDG_CONFIG_DIRS="/etc/xdg"
      else
        XDG_CONFIG_DIRS="/etc/xdg:@_sysconfdir_@/xdg"
      fi
    else
      XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:@_sysconfdir_@/xdg"
    fi
    export XDG_CONFIG_DIRS
    

    当我们解析/etc/xdg/ 来替换@_sysconfdir_@它时,它会导致一个重复的路径(/etc/xdg:/etc/xdg在XDG_CONFIG_DIRS.

    问候

    我是最终用户,远非开发人员,所以我无法完全解决问题。感谢甜点和melebius把我推向了正确的方向,至少我现在理解了这个 if-then-statement。

    我相信在这个环境变量中有两次路径是没有害处的,所以我会避免报告错误。让开发者做更多有价值的事情。

    我的个人解决方案

    我更改了第 67-89 行/usr/bin/startxfce4

    if test "x$XDG_DATA_DIRS" = "x"
    then
      if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then
        XDG_DATA_DIRS="/usr/local/share:/usr/share"
      else
        XDG_DATA_DIRS="/usr/share:/usr/local/share:/usr/share"
      fi
    else
      XDG_DATA_DIRS="$XDG_DATA_DIRS:/usr/share"
    fi
    export XDG_DATA_DIRS
    
    if test "x$XDG_CONFIG_DIRS" = "x"
    then
      if test "x/etc" = "x/etc"; then
        XDG_CONFIG_DIRS="/etc/xdg"
          else
       XDG_CONFIG_DIRS="/etc/xdg:/etc/xdg"
      fi
    else
      XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:/etc/xdg"
    fi
    export XDG_CONFIG_DIRS
    

    至

    if test "x$XDG_DATA_DIRS" = "x"
    then
      XDG_DATA_DIRS="/usr/local/share:/usr/share"
    fi
    export XDG_DATA_DIRS
    
    if test "x$XDG_CONFIG_DIRS" = "x"
    then
      XDG_CONFIG_DIRS="/etc/xdg"
    fi
    export XDG_CONFIG_DIRS
    

    当然,我先备份了原文件。

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve