Quais descritores de arquivos (/ dev / fd / ##) são usados na substituição do processo?

1

Eu tenho um programa que leva 2 entradas:

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

Eu quero redirecionar minhas entradas através da substituição de processos (porque minhas entradas são grandes arquivos de vídeo, que eu quero transcodificar on-the-fly). Através da experiência, estou usando o seguinte, que é funcionalmente bem:

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

Minha pergunta é: por que os descritores de arquivo são 63 e 62? Eles estão sempre garantidos para assumir esses valores, ou isso depende do sistema?

Desculpas se isso estiver bem documentado, mas não consigo encontrá-lo nas minhas pesquisas até agora.

Obrigado pelo seu tempo!

    
por geekydel 11.11.2016 / 14:30

1 resposta

2

O processamento de vídeo é bem conhecido por procurar no arquivo. Isso significa que você não pode usar um fluxo como entrada. E se você estiver usando saída de outro programa, então é um fluxo - não importa se você usa pipes ou fds.

Mas talvez você esteja com sorte que o seu seu programa possa usar pipes. Nesse caso, isso deve ser bom:

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

O & lt; () pode parecer como se estivesse dando algo no stdin assim como & lt; faz. Mas isso não acontece. Em vez disso, é substituído por um link para o pipe:

$ 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]

Então você pode estar em situações em que isso faz sentido:

$ cmd 2> >(cmd2) | cmd3
    
por Ole Tange 12.11.2016 / 08:04