Dalam skrip shell ...
Bagaimana cara menangkap stdin ke variabel tanpa menghapus baris baru yang tertinggal?
Saat ini saya sudah mencoba:
var=`cat`
var=`tee`
var=$(tee)
Dalam semua kasus $var
tidak akan memiliki baris baru dari aliran input. Terima kasih.
JUGA: Jika tidak ada baris baru di input, maka solusinya tidak harus menambahkan satu .
DIPERBARUI DALAM CAHAYA DARI JAWABAN YANG DITERIMA:
Solusi terakhir yang saya gunakan dalam kode saya adalah sebagai berikut:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Jika Anda ingin melihat kode lengkapnya, silakan lihat halaman github untuk expandr , sebuah skrip shell filter-ekspansi git kata kunci open source yang saya kembangkan untuk tujuan keamanan informasi. Menurut aturan yang diatur dalam file .gitattributes (yang bisa spesifik cabang) dan git config , git mem -pipe setiap file melalui skrip shell Expandr.sh setiap kali mengecek masuk atau keluar dari repositori. (Itulah sebabnya sangat penting untuk menjaga jalur baru yang tertinggal, atau kekurangannya.) Ini memungkinkan Anda membersihkan informasi sensitif, dan bertukar dalam set nilai lingkungan yang berbeda untuk pengujian, pementasan, dan cabang langsung.
filter
, maka itu akan menambahkan karakter baris baru ke ujung setiap aliran input yang awalnya tidak berakhir di baris baru. Sebenarnya saya awalnya hanya melakukan filter
tetapi mengalami masalah yang menyebabkan saya untuk solusi ini karena tidak "selalu menambahkan baris baru" atau "selalu strip baris baru" adalah solusi yang dapat diterima.
sed
mungkin akan melakukan baris baru ekstra - tetapi Anda harus mengatasinya filter
dengan yang lain. Dan semua fungsi yang Anda miliki pada dasarnya melakukan hal yang sama - a sed s///
. Anda menggunakan shell untuk mem-pipe data yang telah disimpannya di memorinya sed
sehingga sed
dapat menggantikan data itu dengan data lain yang telah disimpan shell dalam memorinya sehingga sed
dapat menyalurkannya kembali ke shell. Kenapa tidak adil [ "$var" = "$condition" ] && var=new_value
? Saya juga tidak mendapatkan array - apakah Anda menyimpan nama array di [0]
kemudian gunakan sed
untuk menggantikannya dengan nilai [1]
? Mungkin mengobrol?
filter
? Ini berfungsi dengan baik apa adanya. Mengenai cara kerja kode di tautan saya dan mengapa saya mengaturnya seperti yang saya lakukan, ya, mari kita bicarakan di ruang obrolan.
filter
Dibutuhkanstdin
- itu berjalansed
. Anda menangkapstdin
di$GIT_INPUT
kemudian mencetak yang kembali kestdout
atas pipa untukfilter
dan menangkap nyastdout
di$FILTERED_OUTPUT
kemudian mencetaknya kembali kestdout
. Semua 4 baris di bagian bawah contoh di atas bisa diganti dengan hanya ini:filter
. Jangan tersinggung di sini, hanya saja ... Anda bekerja terlalu keras. Anda tidak perlu variabel shell sebagian besar waktu - hanya mengarahkan input ke tempat yang tepat dan meneruskannya.