Saya sering ingin memasukkan data string yang relatif singkat (bisa beberapa baris) ke program commandline yang hanya menerima input dari file (misalnya wdiff) secara berulang. Tentu saya bisa membuat satu atau lebih file sementara, simpan string di sana dan jalankan perintah dengan nama file sebagai parameter. Tetapi bagi saya seolah-olah prosedur ini akan sangat tidak efisien jika data benar-benar ditulis ke disk dan juga dapat membahayakan disk lebih dari yang diperlukan jika saya mengulangi prosedur ini berkali-kali, misalnya jika saya ingin memberi makan satu baris teks panjang file ke wdiff. Apakah ada cara yang disarankan untuk menghindari hal ini, katakanlah dengan menggunakan file semu seperti pipa untuk menyimpan data sementara tanpa benar-benar menulisnya ke disk (atau menulisnya hanya jika melebihi panjang kritis). Perhatikan bahwa wdiff mengambil dua argumen dan,wdiff <"text"
.
98
xargs
?xargs
akan membuat baris input dari argumen string file untuk perintah. Tapi aku butuh yang sebaliknya.echo $data_are_here | dumb_program
?Jawaban:
Gunakan pipa bernama . Sebagai ilustrasi:
The
-e
memberitahu gema untuk benar menafsirkan baris escape (\n
). Ini akan memblokir, yaitu, shell Anda akan hang sampai sesuatu membaca data dari pipa.Buka shell lain di suatu tempat dan di direktori yang sama:
Anda akan membaca gema, yang akan melepaskan shell lainnya. Meskipun pipa ada sebagai simpul file pada disk, data yang melewatinya tidak; itu semua terjadi di memori. Anda dapat latar belakang (
&
) gema.Pipa tersebut memiliki buffer 64k (di linux) dan, seperti soket, akan memblokir penulis ketika penuh, sehingga Anda tidak akan kehilangan data selama Anda tidak membunuh penulis secara prematur.
sumber
/tmp
dikonfigurasikan di sebagian besar distro untuk menggunakantmpfs
sistem file yang ada dalam RAM. Ketika Anda menulis file di/tmp
dalamnya langsung ke RAM Anda yang membuat adalah jawaban yang baik untuk file semi-resilien yang harus diakses dengan cepat dan ditulis ulang berkali-kali.Di Bash, Anda dapat menggunakan
command1 <( command0 )
sintaks pengalihan, yang mengarahkan ulangcommand0
stdout dan meneruskannya kecommand1
yang mengambil nama file sebagai argumen baris perintah. Ini disebut proses substitusi .Beberapa program yang menggunakan argumen nama-baris perintah sebenarnya membutuhkan file akses acak nyata, sehingga teknik ini tidak akan bekerja untuk mereka. Namun, ini berfungsi baik dengan
wdiff
:Di latar belakang, ini menciptakan FIFO, menyalurkan perintah di dalam
<( )
ke FIFO, dan meneruskan deskriptor file FIFO sebagai argumen. Untuk melihat apa yang terjadi, coba gunakan dengannyaecho
untuk mencetak argumen tanpa melakukan apa pun dengannya:Membuat pipa bernama lebih fleksibel (jika Anda ingin menulis logika redirection yang rumit menggunakan beberapa proses), tetapi untuk banyak tujuan ini cukup, dan jelas lebih mudah digunakan.
Ada juga
>( )
sintaks ketika Anda ingin menggunakannya sebagai output, misalnyaLihat juga lembar curang pengalihan Bash untuk teknik terkait.
sumber
ssh -F <(vagrant ssh-config) default
akan sangat bagus tapi sayang.wdiff adalah kasus khusus karena membutuhkan 2 argumen nama file, tetapi untuk semua perintah yang hanya membutuhkan 1 argumen dan yang dengan keras kepala menolak untuk mengambil apa pun selain argumen nama file, ada 2 opsi:
Nama file '-' (yaitu, tanda minus) berfungsi sekitar 1/2 waktu. Tampaknya bergantung pada perintah yang dipermasalahkan dan apakah pengembang perintah tersebut menjebak kasus itu dan menanganinya seperti yang diharapkan. misalnya
Ada file psuedo bernama / dev / stdin yang ada di linux dan dapat digunakan jika nama file mutlak diperlukan oleh sebuah perintah. Ini lebih cenderung berhasil karena tidak memerlukan penanganan nama file khusus dari perintah. Jika fifo berfungsi, atau metode substitusi proses bash berfungsi, maka ini juga harus berfungsi dan tidak spesifik untuk shell. misalnya
sumber