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 / 555058
Accepted
Kusalananda
Kusalananda
Asked: 2019-12-02 07:03:35 +0800 CST2019-12-02 07:03:35 +0800 CST 2019-12-02 07:03:35 +0800 CST

mktemp no macOS não honra $ TMPDIR

  • 772

Eu notei isso antes, mas foi trazido novamente quando eu estava respondendo " Como mover o diretório para um diretório com o mesmo nome? ":

O mktemputilitário no macOS não se comporta da mesma forma que o utilitário de mesmo nome no Linux ou BSD (ou pelo menos no OpenBSD) em relação à TMPDIRvariável de ambiente.

Para criar um arquivo temporário no diretório atual , geralmente posso dizer

tmdfile=$(TMPDIR=. mktemp)

ou

tmpfile=$(TMPDIR=$PWD mktemp)

(e da mesma forma para um diretório temporário com mktemp -d).

No macOS, terei que forçar o utilitário a usar o diretório atual, fornecendo um modelo real, como em

tmpfile=(mktemp ./tmp.XXXXXXXX)

porque usar o mais conveniente tmpfile=$(TMPDIR=. mktemp)ignoraria a TMPDIRvariável e criaria o arquivo em /var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/Tou em um diretório com nome semelhante.

O manual para mktempno macOS menciona que

Se a -t prefixopção for fornecida, mktempgerará uma string de modelo com base no prefixo e na _CS_DARWIN_USER_TEMP_DIRvariável de configuração, se disponível. Os locais de fallback, se _CS_DARWIN_USER_TEMP_DIRnão estiverem disponíveis, são TMPDIRe /tmp.

No meu sistema, _CS_DARWIN_USER_TEMP_DIRparece não estar definido:

$ getconf _CS_DARWIN_USER_TEMP_DIR
getconf: no such configuration parameter `_CS_DARWIN_USER_TEMP_DIR'

mas por exemplo

tmpfile=$(TMPDIR=. mktemp -t hello)

ainda cria um arquivo em /var/folders/.../(também ao usar $PWDno lugar de .).

estou percebendo isso

$ getconf DARWIN_USER_TEMP_DIR
/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T/

mas isso não me ajuda muito, pois eu não saberia como alterar esse valor.

Diz-se que o utilitário macOS mktempvem do FreeBSD, que por sua vez o obteve do OpenBSD (que deve ter sido há bastante tempo).

Pergunta:

Isso é um bug (ou omissão) na implementação do macOS do mktemp? Como faço para alterar o DARWIN_USER_TEMP_DIRvalor (ou _CS_DARWIN_USER_TEMP_DIRmencionado pelo manual) de dentro de um script (o ideal é desativá-lo para que $TMPDIRtenha precedência)?

environment-variables macos
  • 1 1 respostas
  • 1827 Views

1 respostas

  • Voted
  1. Best Answer
    JdeBP
    2019-12-03T08:25:29+08:002019-12-03T08:25:29+08:00

    /var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/

    Este é o diretório local do usuário do Darwin . Seu nome é simplesmente uma codificação de base 32 modificada da concatenação de seu UUID de usuário do MacOS e seu ID de usuário do MacOS (BSD). As duas primeiras letras da codificação são usadas como um sistema "bucket" para tentar manter os tamanhos dos diretórios baixos. Esses dois caracteres são os primeiros 10 bits codificados do UUID do usuário, porque na base 32 um dígito é, obviamente, 5 bits.

    Seus subdiretórios são os diretórios temporários locais do usuário e de cache local do usuário . Seus nomes costumavam ser -Caches-e, -Tmp-mas esses foram abreviados para Ce T. Deve ficar claro que todos esses nomes são fixos e imutáveis, a menos que você queira alterar seu ID de usuário ou UUID de usuário.

    Quando um aplicativo chama confstr(_CS_DARWIN_USER_TEMP_DIR,…), a biblioteca C primeiro tenta garantir que você tenha um diretório local do usuário e, em seguida, tenta garantir que você tenha um diretório temporário local do usuário dentro dele.

    Garantir que você tenha um diretório local do usuário não é trivial, porque você não tem acesso de gravação ao /var/folders. Portanto, existe um daemon de dirhelperinicialização Mach que é executado com privilégios de superusuário e que cria esses diretórios com segurança, respondendo a chamadas Mach IPC de aplicativos de dentro da implementação confstr()em suas bibliotecas C. Você tem acesso de gravação ao diretório local do usuário ( uma vez criado) e, portanto, as bibliotecas C apenas seus filhos diretamente, se eles ainda não existirem.mkdir()

    Se isso for bem-sucedido, o mktempprograma nunca examinará o valor da TMPDIRvariável de ambiente, porque o fallback no mktempcódigo de 's é de chamar confstr()para chamar e getenv()não o contrário. confstr(_CS_DARWIN_USER_TEMP_DIR,…)quase sempre terá sucesso. Seus modos de falha são coisas como o dirhelperdaemon de inicialização que não pode ser executado ou a tentativa de criar o Tsubdiretório falhando com um erro diferente de que o diretório já existe.

    Você pode colocar algo diferente de um diretório como T, mas isso será limpo regularmente pelo dirhelperdaemon de inicialização, que também é o que exclui coisas em /var/folders. A desativação do dirhelperdaemon de inicialização causará problemas próprios, entre os quais /var/foldersnão será a limpeza. Negar a si mesmo a permissão de gravação no diretório local do usuário interferirá potencialmente em todos os outros usos dele, sendo usado para mais do que apenas um Tsubdiretório.

    Sua melhor opção (além de fornecer um modelo) é fazer Tum link simbólico, mas isso ainda está longe de ser bom porque, é claro, afetará todos os aplicativos em execução que podem, no mesmo instante, querer criar um arquivo temporário Arquivo.

    Nem DARWIN_USER_TEMP_DIRnem _CS_DARWIN_USER_TEMP_DIRsão nomes de variáveis. São nomes, para o getconfutilitário e para a confstr()função de biblioteca, de uma string de configuração.

    • 15

relate perguntas

  • Definir Caminho do Ambiente do Grupo

  • Encontre o caminho de onde a variável $CDPATH está localizada?

  • definir o caminho do diretório de inclusão (para *.h) CentOS

  • $PAGER pode conter espaços?

  • Posso definir manualmente vários proxies no ambiente?

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