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 / unix / Perguntas / 789607
Accepted
L. Cornelius Dol
L. Cornelius Dol
Asked: 2025-01-15 09:53:31 +0800 CST2025-01-15 09:53:31 +0800 CST 2025-01-15 09:53:31 +0800 CST

Os sistemas de arquivos Linux podem resolver um caminho relativo antes de resolver um link simbólico?

  • 772

Sou novo usuário de Linux aqui, recém-transferido do Windows 10 para o Fedora 41. Tenho muita experiência com muitos sistemas operacionais, incluindo vários sistemas de arquivos *nix e semelhantes ao Unix.

Tenho uma prática padrão de usar links simbólicos de pastas de teste para repositórios de código para recriar a estrutura de pasta de produção implantada localmente para teste, mantendo o teste e o repositório de código claramente separados. Tenho muitos projetos configurados assim para teste local.

Isto se parece com o seguinte, por exemplo:

~/dev
  test
    a-project
      app => ../../code/a-project/src
        (cfg)
        (web)
      dta
        cfg
  code
    a-project
      src
        cfg
        web

A chave para esse problema é que a src/cfgpasta (que na produção é a app/cfgpasta) contém arquivos que têm referências relativas a arquivos opcionais nos dta/cfgquais são carregados se eles existirem na produção, esperados para serem relativos à app/cfgpasta. Assim, ../../dta/cfg/Optional.jsonquando implantado, faz referência à dtapasta. O PWD é a raiz do aplicativo (em testes, isso é ~/dev/test/a-projecte todos os caminhos no software são especificados em relação ao PWD. Esses caminhos são manipulados em código Java, usando Filea classe Java, então este não é um problema de comportamento do shell.

Isso funciona perfeitamente no Windows, já que o sistema de arquivos considera o caminho app/cfg/../../dta/cfg/Optional.jsonexatamente como ele parece e resolve as referências relativas primeiro, resultando em dta/cfg/Optional.json(o inicial app/cfgsendo eliminado pelo seguinte ../...

Mas o Linux aparentemente resolve o link simbólico primeiro ( app/cfg/=> dev/code/project/src/)e só então aplica os segmentos de caminho relativos ../../dta/cfg/Optional.json, resultando em um arquivo não encontrado porque, é claro, o arquivo não está localizado em ~/dev/code/project/dta/cfg.

Independentemente de argumentos sobre se isso é tecnicamente correto ou não, há alguma maneira de eu dizer ao Linux em qualquer nível para resolver segmentos de caminho relativos antes de resolver links simbólicos para que esse comportamento inesperado e imprevisível não ocorra? Além de ser confuso e contraintuitivo para mim, tenho muito código existente que espera que os caminhos resolvam referências relativas primeiro, ou seja, usando o caminho aparente, não o caminho subjacente.

O sistema de arquivos para meu trabalho de desenvolvimento é ext4 com case folding habilitado (vindo do Windows e precisando permanecer compatível com outros desenvolvedores usando Mac e Windows), e eu realmente, realmente gostaria de evitar fazer uma mudança desestabilizadora e invasiva em várias classes Java para implementar a resolução de caminho relativo antes de passar o caminho para o sistema operacional; tanto porque é potencialmente frágil, levando a falhas de segurança, quanto porque é necessário apenas para meus testes, já que sistemas de produção (servidores Ubuntu Linux) não precisam desses links simbólicos.

symlink
  • 1 1 respostas
  • 94 Views

1 respostas

  • Voted
  1. Best Answer
    Philip Couling
    2025-01-15T18:21:51+08:002025-01-15T18:21:51+08:00

    A resposta simples é "não". Sem alterar o código Java, os links simbólicos não farão o que você pede.

    Por que?

    Isso porque ..não é o que você pensa...

    O comportamento não é imprevisível. Só é realmente surpreendente porque o cdcomando faz algo estranho. Em todos os outros contextos, ..é interpretado pelo kernel como algo real no sistema de arquivos. Cada diretório na verdade contém um filho chamado ..que se refere diretamente ao seu pai.

    Então foo/..diz ao kernel para seguir o link simbólico fooe então procurar o nome ..naquele diretório. O kernel realmente não está fazendo nada diferente do que faria para o caminho foo/bar.

    Opções

    Layout de configuração alternativo

    Como observação: o problema que você enfrenta parece vir do fato de que sua configuração também está armazenada no diretório do seu código-fonte. Esse é um padrão incomum.

    Normalmente, você colocaria a configuração no diretório de teste, tornando-a específica para o teste. A configuração pode referenciar o local do aplicativo ou seu script de execução conhece o layout.

    Você sempre pode criar links simbólicos para arquivos de configuração individuais no test/app/cfgdiretório. Desde que o caminho do diretório em si não seja um link simbólico, o caminho real do arquivo de configuração em si pode ser um link simbólico.

    Usar montagens de ligação / docker

    Eu pessoalmente prefiro montagens de vinculação para esse tipo de coisa e, para esse propósito, geralmente uso o Docker e o Docker Compose como uma forma de configurar o teste.

    Você pode preferir usar um script de shell para configurar montagens de vinculação para você, já que o Java geralmente requer algum tipo de script de execução.

    Por exemplo: arquivo docker-compose.yaml no diretório de teste

    services:
      test:
        image: openjdk:25-jdk-bullseye
        volumes: 
        - ../../code/a-project/src:/app/
        - ./data:/data/
        # Whatever your run script is...
        run: run.sh 
    

    Também é possível configurar isso manualmente usando unshareand mount --binde finally execem um script. Mas isso é mais complexo.

    • 7

relate perguntas

  • Expansão de caminho de alias

  • Como fazer com que o tar siga todos os links simbólicos, exceto um link simbólico recursivo

  • Caminhos em ln com hard links e soft links

  • Link simbólico criado acidentalmente para uma pasta nessa pasta

  • É possível um arquivo shadow no diretório com links simbólicos?

Sidebar

Stats

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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

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