Mengapa Anda ingin melakukan ini tanpa substitusi?
Thanatos
Saya suka aliran notasi Polandia terbalik saat menulis dengan pipa saja. Saya coding lebih cepat dan kualitas kode / kecepatan tidak begitu penting. Juga saya tidak ketika merantai itu akan lebih mudah untuk mengomentari bagian dari rantai dan menggemakan output saat ini daripada menghapus kutu dll.
MageProspero
Jika Anda khawatir tentang kemudahan debug, pertimbangkan untuk menempatkan perintah backticks pada serangkaian baris terpisah. A=$( some | command | here )dengan masing-masing some |, command |dan herepada baris sendiri.
tidakkah seharusnya ada jarak di antara IFS=dan read?
caesarsol
Semua salam pipa terakhir. Juga set catatan samping + m (ermmm atau -m) diperlukan dari baris perintah dia karena pipa terakhir tidak bekerja dengan kontrol pekerjaan aktif.
MageProspero
17
Anda dapat melakukan sesuatu seperti ini, jika Anda menggunakan bash:
echo cart |while read spo;do echo $spo;done
Sayangnya, variabel "spo" tidak akan ada di luar loop while-do-done. Jika Anda bisa menyelesaikan apa yang Anda inginkan di dalam while-loop, itu akan berhasil.
Anda benar-benar dapat melakukan hampir apa yang Anda tulis di atas di ATT ksh (bukan di pdksh atau mksh) atau di zsh yang menakjubkan:
% echo cart | read spo
% echo $spo
cart
Jadi, solusi lain adalah menggunakan ksh atau zsh.
Anda dapat menggunakan proses-proses dalam Korn Shell (mis. mksh): echo cart |& while read -p spo; do echo $spo; done(Sebenarnya lebih baik digunakan while IFS= read -p -r spo; do…)
mirabilos
2
Jika saya memahami masalah ini dengan benar, Anda ingin mengirim stdout ke variabel. Setidaknya itulah yang saya cari dan berakhir di sini. Jadi bagi mereka yang berbagi nasib saya:
Mengapa Anda ingin menyalurkan output ke dataran cat?
roaima
1
@roaima Beberapa perintah mengenali bahwa mereka berjalan pada terminal dan berperilaku berbeda dari jika mereka mengeluarkan ke pipa. Khususnya mereka dapat memotong garis ke lebar layar saat ini. Untuk sebagian besar perintah, perintah kucing berlebihan.
BillThor
Ah ok, saya mengerti sekarang apa yang Anda coba gambarkan. The echo | catmembangun melemparkan saya.
roaima
1
Inilah solusi saya untuk masalah ini.
# assign will take last line of stdout and create an environment variable from it# notes: a.) we avoid functions so that we can write to the current environment# b.) aliases don't take arguments, but we write this so that the "argument" appears# behind the alias, making it appear as though it is taking one, which in turn# becomes an actual argument into the temporary script T2.# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
A=$( some | command | here )
dengan masing-masingsome |
,command |
danhere
pada baris sendiri.Jawaban:
Akan bekerja (menyimpan output
echo
tanpa karakter baris baru ke dalamspo
variabel) selamaecho
output hanya satu baris.Anda selalu bisa melakukan:
Solusi berikut akan berfungsi dalam
bash
skrip, tetapi tidak padabash
prompt:Atau:
Untuk menyimpan output
whatever
hingga karakter NUL pertama (bash
variabel tetap tidak dapat menyimpan karakter NUL) di$spo
.Atau:
untuk menyimpan output
whatever
dalam$spo
array (satu baris per elemen array).sumber
IFS=
danread
?Anda dapat melakukan sesuatu seperti ini, jika Anda menggunakan
bash
:Sayangnya, variabel "spo" tidak akan ada di luar loop while-do-done. Jika Anda bisa menyelesaikan apa yang Anda inginkan di dalam while-loop, itu akan berhasil.
Anda benar-benar dapat melakukan hampir apa yang Anda tulis di atas di ATT ksh (bukan di pdksh atau mksh) atau di zsh yang menakjubkan:
Jadi, solusi lain adalah menggunakan ksh atau zsh.
sumber
mksh
):echo cart |& while read -p spo; do echo $spo; done
(Sebenarnya lebih baik digunakanwhile IFS= read -p -r spo; do…
)Jika saya memahami masalah ini dengan benar, Anda ingin mengirim stdout ke variabel. Setidaknya itulah yang saya cari dan berakhir di sini. Jadi bagi mereka yang berbagi nasib saya:
Ditugaskan
cart
ke variabel$spa
.sumber
Jika Anda hanya ingin menampilkan penggunaan aliran pipa saat ini
cat
.Jika Anda ingin melanjutkan rantai perintah Anda, coba gunakan
tee
perintah untuk mengulang output.Anda bisa menggunakan alias untuk mempersingkat perintah.
sumber
cat
?echo | cat
membangun melemparkan saya.Inilah solusi saya untuk masalah ini.
sumber