¿Qué descriptores de archivo (/ dev / fd / ##) se usan en la sustitución de procesos?

1

Tengo un programa que toma 2 entradas:

my_program --input1 {videoFile1} --input2 {videoFile2}

Quiero redirigir mis entradas a través de la sustitución del proceso (porque mis entradas son archivos de video grandes, que quiero transcodificar sobre la marcha). A través del experimento, estoy usando lo siguiente, que está funcionalmente bien:

my_program --input1 /dev/fd/63 --input2 /dev/fd/62 <( {video transcoding command 1} ) <( {video transcoding command 2} )

Mi pregunta es: ¿por qué los números de descriptor de archivo 63 y 62? ¿Están siempre garantizados para tomar esos valores, o esto depende del sistema?

Disculpas si esto está bien documentado, pero hasta ahora no puedo encontrarlo en mis búsquedas.

¡Gracias por tu tiempo!

geekydel
fuente
No sé la respuesta a su pregunta, pero, en bash, no debería my_program --input1 <( {video transcoding command 1} ) --input2 <( {video transcoding command 2} )ser equivalente, sin la necesidad de especificar explícitamente el descriptor del archivo de tubería.
steeldriver
Ajá, no estaba al tanto de esa sintaxis. Sí, eso es exactamente lo que necesito, ¡gracias!
geekydel

Respuestas:

2

El videoprocesamiento es bien conocido por buscar en el archivo. Eso significa que no puede usar una secuencia como entrada. Y si está utilizando la salida de otro programa, entonces es una secuencia, no importa si usa tuberías o fds.

Pero quizás tenga suerte de que su programa pueda usar tuberías. En ese caso, esto debería estar bien:

my_program --input1 <( {video transcoding command 1} ) --input2 <( {video transcoding command 2} )

El <() puede parecer que le está dando algo en stdin al igual que <lo hace. Pero no lo hace. En su lugar, se sustituye con un enlace a la tubería:

$ echo <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true)
/dev/fd/63 /dev/fd/62 /dev/fd/61 /dev/fd/60 /dev/fd/59 /dev/fd/58 /dev/fd/57 /dev/fd/56 /dev/fd/55 /dev/fd/54 /dev/fd/53 /dev/fd/52 /dev/fd/51 /dev/fd/50 /dev/fd/49 /dev/fd/48 /dev/fd/47 /dev/fd/46 /dev/fd/45 /dev/fd/44 /dev/fd/43 /dev/fd/42 /dev/fd/41 /dev/fd/40 /dev/fd/39 /dev/fd/38 /dev/fd/37 /dev/fd/36 /dev/fd/35 /dev/fd/34 /dev/fd/33 /dev/fd/32 /dev/fd/31 /dev/fd/30 /dev/fd/29 /dev/fd/28 /dev/fd/27 /dev/fd/26 /dev/fd/25 /dev/fd/24 /dev/fd/23 /dev/fd/22 /dev/fd/21 /dev/fd/20 /dev/fd/19 /dev/fd/18 /dev/fd/17 /dev/fd/16 /dev/fd/15 /dev/fd/14 /dev/fd/13 /dev/fd/12 /dev/fd/11 /dev/fd/10 /dev/fd/9 /dev/fd/8 /dev/fd/7 /dev/fd/6 /dev/fd/5 /dev/fd/3 /dev/fd/4 /dev/fd/64 /dev/fd/65 /dev/fd/66 /dev/fd/67
$ ls -l <(true)
lr-x------ 1 tange tange 64 Nov 12 07:59 /dev/fd/63 -> pipe:[1200523]

Entonces puede estar en situaciones en las que esto tiene sentido:

$ cmd 2> >(cmd2) | cmd3
Ole Tange
fuente
De hecho, es el caso de que mi programa puede usar tuberías (y ha sido escrito específicamente con ese caso en mente). No conocía la sintaxis para redirigir un comando en cada entrada (su primer bloque de código anterior), que es exactamente lo que necesito. ¡Gracias!
geekydel