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 / server / Perguntas / 1126745
Accepted
Newskooler
Newskooler
Asked: 2023-03-21 19:01:31 +0800 CST2023-03-21 19:01:31 +0800 CST 2023-03-21 19:01:31 +0800 CST

variável de ambiente de fornecimento em bashrc: diretamente versus exportação do arquivo produz resultado diferente - por que

  • 772

Estou executando o systemd via user (ou seja enable-linger $USER) e interajo com os serviços viasystemctl --user

Notei um problema estranho.

Fornecimento Tipo 1

Para que o systemd acima funcione para um usuário, preciso adicionar export XDG_RUNTIME_DIR=/run/user/$(id -u)dentro do meu~/.bashrc

Isso funciona bem.

Fornecimento Tipo 2

Quando, em vez disso, procuro meu bashrc da seguinte maneira, o systemd não funciona:

dentro .bashrc:

source /path_to_file/my_file.env

dentro my_file.env:

XDG_RUNTIME_DIR=/run/user/$(id -u)

Tanto o Sourcing Type 1 quanto o 2 produzem o mesmo resultado quando eu faço isso, echo $XDG_RUNTIME_DIRentão decidi ir com o Type 2. No entanto, notei que quando fiz systemctl --user daemon-reloado daemon não estava rodando e recebi o seguinte erro:

Failed to connect to bus: No such file or directory

Quando eu volto para Souring Type 1, o erro desaparece e tudo funciona conforme o esperado.

Minha pergunta é: O que está acontecendo que estou perdendo aqui? Minha principal confusão decorre do fato de que as variáveis ​​env são as mesmas, mas os resultados finais não são.

systemd
  • 1 1 respostas
  • 143 Views

1 respostas

  • Voted
  1. Best Answer
    user1686
    2023-03-22T01:08:12+08:002023-03-22T01:08:12+08:00

    Você esqueceu o exportem seu arquivo .env, então a variável não é realmente uma variável de ambiente .

    As variáveis ​​de shell não são exportadas para o ambiente por padrão. Apenas as atribuições a uma variável já exportada serão reexportadas automaticamente; se XDG_RUNTIME_DIRfor uma variável totalmente nova, ela se tornará uma variável interna do shell, a menos que você use o exportou declare -xbuiltins. (Ou, a menos que a opção de shell "allexport" esteja habilitada, mas usá-la em .bashrc tem algumas pegadinhas estranhas.)

    echo $FOO"vê" a variável porque a expansão de $FOO na linha de comando é feita pelo próprio interpretador de shell, não pelo comando - 'echo' não precisa acessar o ambiente, enquanto 'systemctl' precisa.

    Em vez de echo, você pode usar declare -p FOOpara que o próprio shell informe o estado da variável (incluindo mostrar o xsinalizador se a variável for exportada), ou usar envou printenvpara ver como o ambiente se parece do ponto de vista de um processo externo (não -variáveis ​​de shell exportadas simplesmente não aparecerão aqui).

    De qualquer forma, você nunca precisará fazer isso para logins interativos. Essa variável específica deve ser colocada em seu ambiente por meio do PAM (por pam_systemd) assim que você fizer login - mesmo antes de seu shell ser executado.

    Para scripts que precisam acessar os serviços de outro usuário, systemctl --user -M ${USER}@.hostfará com que o próprio systemctl encontre o diretório de tempo de execução do usuário especificado e o soquete D-Bus.

    • 4

relate perguntas

  • After= opção não está funcionando no arquivo de serviço systemd

Sidebar

Stats

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

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 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