AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 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

O que significa esta declaração se-então?

  • 772

Brincando no meu sistema, me deparei com

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

Me perguntando por que /usr/shareestá duas vezes no caminho descobri que o trecho a seguir no /etc/alternatinves/x-session-managerqual está um link para /usr/bin/startxfce4é o responsável:

#!/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
.
.
.

Quando eu olho para a linha

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

Eu tenho dificuldades para entender esta declaração if, para mim parece uma comparação de strings onde a primeira é sempre falsa e a segunda é sempre verdadeira.

Combinado com uma lógica or, o teste sempre avalia como true , então eu poderia encurtar a linha para if true; thenou poderia dizer que não preciso de uma instrução if.

Onde está o meu erro? Ou está escrito assim para confundir iniciantes como eu?

command-line sh
  • 2 2 respostas
  • 239 Views

2 respostas

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

    Você está certo, o comando

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

    retorna verdadeiro (0) sempre.

    Parece que o arquivo em questão foi gerado a partir de uma versão mais genérica, mas a forma de geração não foi a ideal. O script deve solicitar caminhos reais a cada vez ou manter apenas a ramificação relevante no arquivo gerado.

    No entanto, este arquivo específico vem de um pacote – não sendo gerado em sua máquina. É provável que isso seja corrigido/melhorado… Você pode registrar um bug no Xfce Bugzilla (se ainda não estiver presente lá) ou corrigi-lo você mesmo. Você pode clonar o repositório Git para a sessão do Xfce4 , você também pode entrar em contato com os desenvolvedores do Xfce4 usando sua lista de discussão . Boa sorte com a melhoria do código!

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

    O script /usr/bin/startxfce4parece ser gerado por um analisador, podemos ver que quando olhamos o código fonte , vamos dar uma olhada no trecho correspondente:

    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
    

    Aqui podemos ver o significado deste bloco if, os desenvolvedores dão aos mantenedores de pacotes a oportunidade de adicionar um caminho personalizado XDG_DATA_DIRSanalisando o caminho desejado para o script e substituindo a string @_datadir_@por esse caminho.

    Isso funcionará perfeitamente, se for analisado um caminho que não esteja contido no XDG_DATA_DIRSmomento em que o script for executado, mas resultará no mesmo caminho aparecendo duas vezes XDG_DATA_DIRSse analisarmos um caminho que já existe no XDG_DATA_DIRSmomento em que o script é executado.

    Isso pode ser evitado não analisando as pastas XDG padrão ( /usr/share, /usr/local/share) para o script, mas não sei se isso é possível.

    Outra solução é alterar o código-fonte para

    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
    

    Isso cobriria apenas os diretórios /usr/sharee /usr/local/shareembora e deve-se verificar se @_datadir_@já existe XDG_DATA_DIRSou não, mas não sei quem fazer isso, meu conhecimento termina aqui.

    Além disso:

    O mesmo se aplica a esta parte do script:

    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
    

    Quando analisamos /etc/xdg/ para substituir @_sysconfdir_@, ele leva a um caminho duplicado ( /etc/xdg:/etc/xdgem XDG_CONFIG_DIRS.

    Saudações

    Eu sou um usuário final, longe de ser um desenvolvedor, então não consigo resolver o problema completamente. Graças à sobremesa e ao Melebius que me empurraram na direção certa, pelo menos eu entendo essa declaração se-então-agora.

    Acredito que não há mal nenhum em ter um caminho duas vezes nestas variáveis ​​de ambiente, então vou me abster de relatar um bug. Deixe os desenvolvedores fazerem coisas mais valiosas.

    Minha solução pessoal

    Eu mudei as linhas 67-89 em/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
    

    para

    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
    

    Claro, eu fiz backup do arquivo original primeiro.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve