Ho un bash-script in cui voglio comunicare con l'utente su standard output, ma anche inviare comandi a un sotto-processo tramite un descrittore di file - in questo modo:Autorizzazione del descrittore di file negata con la sostituzione del processo di bash?
# ...
# ...
echo "Hello user, behold a cleared gnuplot window"
# pass the string "clear" to gnuplot via file descriptor 3
echo "clear" >&3
così ho pensato che potrebbe "impostare questa funzione" di prima di iniziare il sottoprocesso in questo modo:
#!/bin/bash
# Initiate(?) file descriptor 3, and let it direct to a newly
# started gnuplot process:
exec >3 >(gnuplot)
Ma questo produce un errore:
/dev/fd/63: Permission denied
Is ° è previsto?
Non capisco cosa sta succedendo. (Sto facendo qualcosa di sbagliato Può essere che il mio sistema ha alcune impostazioni di protezione speciali, respingendo quello che sto cercando di fare (con Ubuntu Linux 12.10)??).
"Workaround" - il seguente sembra essere equivalente con quello che sto cercando di fare, e funziona senza errori:
#!/bin/bash
# open fd 3 and direct to where fd 1 directs to, i.e. std-out
exec 3>&1
# let fd 1 direct to a newly opened gnuplot process
exec 1> >(gnuplot)
# fd 1 now directs to the gnuplot process, and fd 3 directs to std-out.
# I would like it the other way around. So we'll just swap fd 1 and 3
# (using an extra file descriptor, fd 4, as an intermediary)
exec 4>&1 # let fd 4 direct to wherever fd 1 directs to (the gnuplot process)
exec 1>&3 # let fd 1 direct to std-out
exec 3>&4 # let fd 3 direct to the gnuplot process
exec 4>&- # close fd 4
O, come one-liner:
#!/bin/bash
exec 3>&1 1> >(gnuplot) 4>&1 1>&3 3>&4 4>&-
perché è questo lavoro, ma la versione iniziale non è?
Qualsiasi aiuto molto apprezzato.
$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
[...]
provare il flag '-C'. – Tobu
man sudo ... "L'opzione -C (close from) consente all'utente di specificare un punto di partenza sopra l'errore standard (file descriptor three)." Quindi, come dovrei usare questo nel contesto sopra? –