5

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) 
[...] 

risposta

1

Hai un errore di battitura; utilizzare exec 3> >(gnuplot) anziché exec >3 >(gnuplot).

BTW, sì, è previsto. exec >3 >(gnuplot) reindirizza lo stdout in un file denominato 3, quindi tenta di eseguire >(gnuplot) (che si traduce in/dev/fd/63) come programma.

1

mi è stato sempre:

/dev/fd/63: Permission denied

con sostituzione di processo dovuti all'uso di sudo come notato here.

Quindi non fanno fanno che:

$ sudo ruby <(echo "puts 'foo'") 
ruby: Bad file descriptor -- /dev/fd/63 (LoadError) 
+0

provare il flag '-C'. – Tobu

+0

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? –

Problemi correlati