Terkait dengan pertanyaan yang saya ajukan di Stack Overflow: Melewati beberapa baris kode ke wsadmin.sh? .
Saya memiliki, sebagai string, beberapa baris input yang perlu saya masukkan ke dalam perintah. Namun, perintahnya hanya menerima file yang penuh dengan input.
Apakah ada cara saya bisa menyimpan baris dalam file atau pipa sementara yang tidak pernah benar-benar ditulis ke disk dan kemudian memasukkannya langsung ke program?
Bagaimana cara saya mendapatkan pipa, memasukkan input ke dalamnya, melewati pipa itu ke perintah, dan kemudian menyingkirkan pipa?
linux
command-line
bash
ArtOfWarfare
sumber
sumber
Jawaban:
Solusi lain adalah dengan menggunakan Proses Substitusi di Bash. Jika sistem Anda memiliki nama pipa, Anda dapat menggunakan fitur ini.
Digunakan seperti ini:
di mana
list
urutan perintah shell (sebenarnya jaringan pipa; rincian lengkapnya ada di sini ).list
akan dieksekusi, dan hasilnya akan terhubung ke pipa. Nama pipa kemudian diteruskan ke program Anda.CATATAN: spasi tidak diizinkan antara
<
dan(
.(Substitusi lain
>(list)
juga berfungsi seperti yang Anda harapkan.)Dalam kasus spesifik Anda , Anda dapat menggunakan
meskipun Anda mungkin menemukan solusi @ meuh menjadi lebih elegan.
Pembaruan: Banyak sekali contoh penggunaan dapat ditemukan di Panduan Pembuatan Skrip Bash Lanjutan .
sumber
Anda dapat menggunakan bash di sini-doc . Sebagai contoh,
Jika Anda memiliki sesuatu dalam variabel bash, Anda juga dapat menginterpolasinya: mis
<<<"path is $PATH"
.Jika perintah Anda bersikeras nama file, Anda bisa memberikannya
/dev/stdin
. Misalnya:menghasilkan output:
s/b/b/
.sumber
stdin
, dan jika tidak, ini tidak akan berhasil. Saya harap OP mengklarifikasi."-f" option must be followed by a file name.
-f
dan nama file, maka berikan nama file/dev/stdin
. Lihat hasil edit saya./dev/stdin
saran. Program yang saya coba panggil hanya menerima nama file, jadi saya telah dikombinasikan/dev/stdin
dengan heredoc.Bergantung pada apa yang ada di skrip, Anda mungkin dapat menggunakan nama file khusus - (minus) yang merupakan singkatan dari stdin
Metode lain yang mungkin berfungsi untuk Anda adalah membuka file
/dev/fd/0
yang lagi-lagi singkatan dari stdin .Opsi ketiga adalah membuat FIFO (First In First Out). Itu seperti file, tetapi memiliki dua ujungnya - Anda menulis di satu ujung dan membaca dari yang lain.
sumber
-
dengan cara ini - ini bukan fitur dari shell atau sistem operasi. Meskipun tentu saja sebagian besar utilitas Linux standar mengikuti konvensi ini, sejauh yang saya tahu.expect
.<()
solusi, tetapi lebih eksplisit - yang mungkin sangat berguna!Ada pilihan lain yang mirip dengan
mycmd -
solusinya, tetapi bahkan untuk program yang tidak menangani-
secara khusus:/dev/stdin
tampaknya terkait dengan OS dan berfungsi untuk saya di Debian GNU / Linux, tapi saya tidak yakin di mana lagi itu akan berfungsi juga.sumber
^D
?^D
adalah notasi umum untuk menekan Ctrl-D. ^ D memiliki semantik "end of input stream" di sini. Ini mungkin lebih sering terlihat di^C
atau^Z
yang berdiri untuk menekan Ctrl-C masing-masing untuk menekan Ctrl-Z./dev/stdin
dan kemudian menutupnya?cat content | mycmd /dev/stdin
. Bayangkan saja berbagai perintah daricat
sini.