Links simbólicos "Junctioned" [duplicados]

4

O Linux tem a capacidade de usar links simbólicos "junção"? Não tenho certeza se este é um termo real ou não, então deixe-me explicar o conceito.

Eu tenho um repositório git contendo todos os meus arquivos de ponto de configuração em ~/dotfiles . Eu uso links simbólicos neste diretório para "ativá-los". Por exemplo, executando ln -s ~/dotfiles/bash/bash_profile ~/.bash_profile para produzir o link:

~/.bash_profile -> ~/dotfiles/bash/bash_profile

No entanto, encontro-me numa situação em que pretendo combinar o conteúdo de vários ficheiros. Por exemplo, eu quero que o link simbólico ~/.bash_profile aponte para dois arquivos separados, um para cada projeto. Por exemplo:

~/.bash_profile
(1) -> ~/dotfiles/bash/bash_profile
(2) -> ~/dotfiles/proj/bash_profile

Eu sei que posso simplesmente concatenar os dois arquivos (por exemplo, cat ~/dotfiles/{bash,proj}/bash_profile > ~/.bash_profile ), mas se eu puder fazer a mesma coisa com links simbólicos, prefiro.

Eu imagino que se tal recurso existir (o Nix é muito grande), então ele teria que mapear os dois arquivos diferentes juntos, escondendo todos os tipos de complexidades sob o capô (mapeamento de offsets de arquivos de todos os não primeiros arquivos "mapeados", bloqueando todos os arquivos ao gravar no link simbólico com junção, etc, etc.).

Se tal recurso não existir, existem planos para implementá-lo?

    
por magnus 23.02.2016 / 23:39

2 respostas

3

Os links simbólicos apenas dizem "vá procurar este arquivo em outro lugar". O conteúdo de um link simbólico é o mesmo que o conteúdo de seu destino. Então, não, links simbólicos não podem fazer isso. Sugiro não tentar procurar um recurso relacionado a links simbólicos, porque o que você procura não é. Eu não teria entendido o que você queria do termo "link simbólico entrecortado", e mesmo depois de ver o que você quer, eu não tenho idéia de por que você o chama assim.

Você deseja ter arquivos cujo conteúdo é o resultado da combinação do conteúdo de vários arquivos. Isso significa que parte do sistema tem que ser capaz de realizar essa combinação, e você tem que descrever o tipo de combinação que você quer (concatenação, se eu entendi corretamente).

Os modernos sistemas unix têm uma maneira de fazer com que dados arbitrários apareçam como um arquivo, independentemente de como ele é armazenado: FUSE . Com o FUSE, toda operação em um arquivo (criar, abrir, ler, escrever, listar diretório, etc.) invoca algum código em um programa, e esse código pode fazer o que você quiser. Consulte Crie um arquivo virtual que, na verdade, um comando . Você pode experimentar scriptfs ou fuseflt , ou se você estiver se sentindo ambicioso, gere o seu próprio.

Para este caso de uso, não acho que a geração dinâmica seja o caminho a ser seguido. É um pouco complicado e não funciona em todos os lugares (o FUSE nem sempre é acessível a usuários não-root e não está disponível em alguns sistemas como o Windows, mesmo com o Cygwin). Eu recomendo que você use a mesma abordagem que eu uso: para arquivos que possuem algum tipo de facilidade include ( .bash_profile , .gitconfig ,…), use isso; para outros arquivos, quando você modificou um dos arquivos constituintes, digite make (ou o sistema de compilação que preferir) para gerar novamente os arquivos que os aplicativos lêem.

    
por 24.02.2016 / 01:17
1

Arquivos de configuração modulares como uma função de processamento de texto

O que você está pedindo é mais apropriadamente o processamento de texto do que o processamento de arquivos, e depende muito do programa que está consumindo os arquivos de texto.

A maneira tradicional e direta de fazer o que você quer é ter um arquivo de nível superior que inclua outros arquivos de maneira modular, como:

~ / .bash_profile:

source ~/dotfiles/bash/bash_profile
source ~/dotfiles/proj/bash_profile

Um benefício é que você pode comentar linhas para fazer alterações temporárias e manter a intenção óbvia:

source ~/dotfiles/bash/bash_profile
# source ~/dotfiles/proj/bash_profile
source ~/dotfiles/proj2/bash_profile

Gerenciando scripts com diretórios de links simbólicos

Mas se você realmente quiser usar links simbólicos para gerenciar uma coleção de arquivos de configuração bash , existe uma maneira bem estabelecida de fazer isso com muito pouca "cola" sobre os links simbólicos existentes.

Tente criar um diretório chamado (por exemplo) ~/.bash_profiles , que contém links com nomes como 00base (apontando para ~/dotfiles/bash/bash_profile ) e 10proj (apontando para ~/dotfiles/proj/bash_profile ), depois colocando isso em ~ /. bash_profile:

for file in ~/.bash_profiles/* ; do source $file ; done

Depois, você pode ativar, desativar e reordenar os arquivos de configuração, manipulando links simbólicos e sem editar nenhum arquivo. Isso funciona porque a expansão de ~/.bash_profiles/* é classificada lexicalmente por bash.

Isso é essencialmente como o clássico Unix / Linux init permite o gerenciamento de scripts de inicialização do sistema. É provavelmente um pouco exagerado para bash , a menos que você tenha um conjunto muito complexo de personalizações para carregar seletivamente com base no projeto em que você está trabalhando.

    
por 10.05.2016 / 21:01