Algumas camadas têm o recurso embutido.
zsh
A forma de
zsh
de substituição de processo de
=(...)
de processo usa um arquivo temporário. Por exemplo,
=(echo test)
expande para o caminho de um arquivo temporário que contém
test\n
.
$ {cat $file; ls -l /dev/fd/3; echo test2 >&3; cat $file} 3<> ${file::==(echo test)}
test
lrwx------ 1 stephane stephane 64 Jan 30 11:19 /dev/fd/3 -> /tmp/zshMLbER0
test2
Esse arquivo é removido automaticamente assim que o comando terminar.
bash / zsh no Linux.
Aqui, os arquivos ou as sequências aqui em bash
e zsh
são implementados como arquivos temporários excluídos.
Então, se você fizer isso:
exec 3<<< test
O descritor de arquivo 3 está conectado a um arquivo temporário excluído que contém test\n
.
Você pode obter seu conteúdo com:
cat <&3
Se no Linux, você também pode ler ou gravar no arquivo via /dev/fd/3
$ exec 3<<< test
$ cat <&3
test
$ echo foo > /dev/fd/3
$ cat /dev/fd/3
foo
(alguns outros shells usam pipes, ou podem usar /dev/null
se o doc aqui estiver vazio).
POSIX
Não existe o utilitário mktemp
POSIX. No entanto, o POSIX especifica uma mkstemp(template)
C API e o utilitário m4
standard expõe essa API com a função mkstemp()
m4 com o mesmo nome.
mkstemp()
fornece um nome de arquivo com uma parte aleatória que era garantida a não existir no momento em que a função foi chamada. Ele cria o arquivo com permissões 0600 de uma maneira livre de raça.
Então, você poderia fazer:
tmpfile=$(
echo 'mkstemp(template)' |
m4 -D template="${TMPDIR:-/tmp}/baseXXXXXX"
) || exit
Note, entretanto, que você precisa lidar com a limpeza ao sair, mas se você só precisa escrever e ler o arquivo um número fixo de vezes, você pode abri-lo e deletá-lo logo após criar um arquivo para o aqui-doc Abordagem here-string acima:
tmpfile=$(
echo 'mkstemp(template)' |
m4 -D template="${TMPDIR:-/tmp}/baseXXXXXX"
) || exit
# open once for writing, twice for reading:
exec 3> "$tempfile" 4< "$tempfile" 5< "$tempfile"
rm -f -- "$tmpfile"
cmd >&3 # store something in the temp file
exec 3>&- # fd no longer needed
# read the content twice:
cat <&4
cat <&5
Você poderia abrir o arquivo para leitura uma vez e retroceder entre duas leituras, como não há nenhum utilitário POSIX que possa retroceder ( lseek()
), portanto, não é possível portá-lo em um script POSIX ( zsh
( sysseek
builtin) e ksh93
( <#((...))
operator) podem fazê-lo embora.