Ho cercato di usare il descrittore di file di lettura/scrittura in bash in modo che potessi eliminare il file che il descrittore di file di cui in seguito, come ad esempio:Bash leggere descrittori di file/scrittura - cercare di avviare di file di
F=$(mktemp)
exec 3<> "$F"
rm -f "$F"
echo "Hello world" >&3
cat <&3
ma il comando cat
non fornisce output. Posso ottenere ciò che voglio se uso i descrittori di file separati per la lettura e la scrittura:
F=$(mktemp)
exec 3> "$F"
exec 4< "$F"
rm -f "$F"
echo "Hello world" >&3
cat <&4
che stampa Hello world
.
sospettavo che bash non cerca automaticamente all'avvio del descrittore di file quando si passa dalla scrittura alla lettura, e la seguente combinazione di bash e il codice python conferma:
fdrw.sh
exec 3<> tmp
rm tmp
echo "Hello world" >&3
exec python fdrw.py
fdrw.py
import os
f = os.fdopen(3)
print f.tell()
print f.read()
che dà:
$ bash fdrw.sh
12
$ # This is the prompt reappearing
C'è un modo per ottenere ciò che voglio semplicemente usando bash?
perché dovresti cancellare il file prima di leggere/scrivere? – unhammer
In Unix, quando si rimuove un file, il file non viene effettivamente eliminato finché tutti i descrittori di file aperti non vengono chiusi. Pertanto, l'eliminazione di un file temporaneo subito dopo l'apertura è una pratica comune, poiché garantisce che nessun altro processo possa alterare il file maliziosamente e che il file venga chiuso dopo che il processo ha chiuso il file o chiuso. – telotortium
Perché non ti piace il tuo metodo di avere descrittori di lettura e scrittura separati? Sembra il modo più semplice. – Kelvin