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 $vartidak 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 filtertetapi mengalami masalah yang menyebabkan saya untuk solusi ini karena tidak "selalu menambahkan baris baru" atau "selalu strip baris baru" adalah solusi yang dapat diterima.
sedmungkin akan melakukan baris baru ekstra - tetapi Anda harus mengatasinya filterdengan 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 sedsehingga seddapat menggantikan data itu dengan data lain yang telah disimpan shell dalam memorinya sehingga seddapat 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 seduntuk 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.
filterDibutuhkanstdin- itu berjalansed. Anda menangkapstdindi$GIT_INPUTkemudian mencetak yang kembali kestdoutatas pipa untukfilterdan menangkap nyastdoutdi$FILTERED_OUTPUTkemudian 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.