Bagaimana saya bisa mengalirkan data ke program yang mengharapkan untuk membaca data dari file yang diberikan sebagai argumen?

17

Saya memiliki file gzip yang besar dan saya ingin sebuah program (impor 4s dalam hal ini) untuk membacanya. Dibutuhkan banyak waktu untuk membuka zip file terlebih dahulu dan kemudian memanggil program dengan path ke file sebagai argumen. Apakah mungkin untuk melakukan sesuatu seperti:

zcat huge.gz | 4s-import <SOME MAGIC>

di mana BEBERAPA-MAGIC seperti jalur ke file abstrak yang berisi stdin?

Alternatif memakan ruang disk yang lebih lambat dan lebih banyak yang harus saya lakukan sebaliknya adalah:

zcat huge.gz > huger
4s-import huger
Jonatan Kallus
sumber

Jawaban:

32

Anda dapat menggunakan operator substitusi proses <()dari bash(atau zsh):

4s-import <(zcat huge.gz)

Operator ini akan membuat fifo sementara /dev/fd/NNdan mengganti <(.)dengan string /dev/fd/NN. 4s-importsekarang dapat membuka /dev/fd/NNdan membaca dari fifo itu, sementara bashakan berjalan zcat huge.gz, yang mengirimkan outputnya ke /dev/fd/NN.

tkrennwa
sumber
17
  1. Banyak program memiliki -input standar. Jika milik Anda melakukannya, gunakan itu sebagai "bawaan".

  2. Anda juga dapat mencoba menggunakan /dev/stdinatau /dev/fd/0sebagai file.

  3. Opsi ketiga adalah menggunakan mkfifountuk membuat file khusus fifo. Dalam satu shell Anda mem-pipe data Anda (mis. gunzip > your_fifo_file), Sedangkan di yang lain Anda memanggil program Anda dengan fifo sebagai file.

Bgs
sumber