Apakah ada cara untuk melakukan ini secara efektif di bash:
/my/bash/script < echo 'This string will be sent to stdin.'
Saya sadar bahwa saya dapat menyalurkan output dari gema seperti ini:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Semua Pekerja Sangat Penting
sumber
sumber
echo
>
bentuk pengalihan akan membuka file descriptor sebagai fd0
(stdin), sedangkan|
membuka memulai proses anak dan atase stdout itu (fd 1) ke stdin proses lain. Fakta ini dapat memiliki konsekuensi non-sepele (pikirkan tentang berbagi variabel lingkungan?)Jawaban:
Anda dapat menggunakan satu baris
heredoc
di atas sama dengan
atau Anda dapat mengarahkan output dari perintah, seperti
atau Anda dapat membaca sebagai
atau sederhana
sumber
echo -e "\x01\x02..." | ./script
)<<<
? Saya malu mengakui bahwa saya belum pernah melihatnya sebelumnya, dan saya benar-benar bingung karenanya. Saya mencoba Googling untuk itu, tetapi hasil saya tidak berhubungan.Anda sudah dekat
Untuk input multiline, di sini-dok cocok:
Edit Untuk komentar:
Untuk mencapai input biner, katakan
Jika Anda mengganti
cat
untuk/my/bash/script
(atau memang menjatuhkan pipa terakhir), cetakan ini:Atau, jika Anda menginginkan sesuatu yang sedikit lebih culun:
Yang merupakan sinus 90 derajat pertama dalam mengapung biner 4byte
sumber
xxd -r
(atauod
) untuk memfilter dokumen DI SINIAnda juga bisa menggunakan
read
seperti inisumber
Larutan
Anda ingin (1) membuat output stdout dalam satu proses (seperti
echo '…'
) dan (2) mengarahkan output itu ke input stdin dari proses lain tetapi (3) tanpa menggunakan mekanisme pipa bash. Inilah solusi yang cocok dengan ketiga kondisi:Ini
<
adalah pengalihan input normal untuk stdin. The<(…)
adalah proses pesta substitusi. Secara kasar itu membuat/dev/fd/…
file dengan output dari perintah substitusi dan meneruskan nama file itu di tempat<(…)
, menghasilkan di sini misalnya discript < /dev/fd/123
. Untuk detailnya, lihat jawaban iniPerbandingan dengan solusi lain
Heredoc satu baris dikirim ke stdin
script <<< 'string'
hanya memungkinkan untuk mengirim string statis, bukan output dari perintah lain.Substitusi proses saja, seperti di
diff <(ls /bin) <(ls /usr/bin)
, tidak mengirim apa pun ke stdin. Sebagai gantinya, proses output diteruskan sebagai konten file yang dibuat di latar belakang, setara dengan misalnyadiff /dev/fd/10 /dev/fd/11
. Dalam perintah itu,diff
tidak mendapat input dari stdin.Gunakan kasing
Saya suka itu, tidak seperti mekanisme pipa, itu
< <(…)
mekanisme ini memungkinkan untuk menempatkan perintah terlebih dahulu dan semua input setelahnya, seperti standar untuk input dari opsi baris perintah.Namun, di luar estetika commandline, ada beberapa kasus di mana mekanisme pipa tidak dapat digunakan. Misalnya, ketika perintah tertentu harus disediakan sebagai argumen untuk perintah lain, seperti dalam contoh ini dengan
sshpass
.sumber
<<<
?Memungkinkan seseorang untuk mengetik beberapa baris ke dalam suatu program, tanpa input yang disimpan dalam riwayat, atau terlihat di
ps
. Cukup tekan Ctrl + C saat selesai mengetik hingga selesaicat
.sumber
sumber
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. Ketiga, sed ini akan jauh lebih dimengerti dengan awk:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'