Use o mktemputilitário para criar um arquivo temporário com um nome imprevisível. Não é padronizado pelo POSIX, mas está disponível no * BSD e no Linux.
> /tmp/predictable.$RANDOMnão é uma boa escolha, pois é previsível¹, o que abre o script para um ataque em que o invasor pode induzi-lo a substituir um arquivo ao qual você tem acesso de gravação ou a fornecer acesso temporário ao arquivo. Esta é uma vulnerabilidade insegura de arquivos temporários . mktempnão possui essa vulnerabilidade porque cria o arquivo com segurança (não substitui um arquivo existente, mesmo se houver links simbólicos) e usa um nome suficientemente imprevisível para evitar uma negação de serviço.
Se criar um arquivo temporário e trabalhar com ele não for bom o suficiente, crie um diretório temporário mktemp -de trabalhe nele.
mktemptambém toma cuidado $TMPDIRse a variável estiver definida, retornando para /tmpse estiver desabilitada.
Cada vez mais distribuições são configuradas TMPDIRpara serem um diretório privado, por exemplo, /run/1234/tmponde 1234está o seu UID. Isso elimina o risco de vulnerabilidades temporárias de arquivos, ao custo de não ser mais possível compartilhar arquivos temporários entre usuários (o que é ocasionalmente útil, mas não com muita frequência; /tmpainda está disponível, apenas não TMPDIR).
Se você precisar de um nome de arquivo reproduzível, crie um arquivo com um nome bem definido (sem componente aleatório) no diretório inicial do usuário. A convenção moderna é a especificação do diretório de usuários XDG . Se o arquivo puder ser removido sem causar perda de dados, use a XDG_CACHE_HOMEvariável de ambiente, padrão como ~/.cache. Você provavelmente deve criar um subdiretório nomeado após o seu aplicativo e trabalhar nele.
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹ Não apenas $RANDOMleva 32767 valores possíveis, mas é fácil prever sem tentar muitos valores. O gerador de números aleatórios do Bash é um LCG semeado pelo PID e pela hora do primeiro uso. O Zsh é a plataforma randsemeada pelo tempo de inicialização. O ATT Ksh's é randsemeado pela plataforma PID. O Mksh's é um LCG com uma semente mais complexa, mas ainda sem qualidade de segurança. Todos eles podem ser previstos por outro processo com uma chance bastante grande de sucesso.
$TMPDIRe~/.cacheé exatamente o que eu precisava. Após algumas reflexões, percebi que a única razão pela qual eu queria/tmpera particionar - para que o cache não pudesse preencher a/homepartição. Mas, para este caso de uso, isso é realmente um não problema, portanto, um subdiretório~/.cachese ajusta perfeitamente às minhas necessidades e evita o problema de segurança.