Saya sering menulis skrip shell KSH yang mengikuti pola yang sama:
- (1) mengambil output dari satu atau lebih perintah
- (2) format menggunakan grep | cut | awk | sed dan cetak ke layar atau ke file
Untuk melakukan itu, saya sering menyimpan output (1) di tempfile, dan kemudian melakukan format di (2) pada file itu.
Ambil kode itu misalnya:
TMPFILE=file.tmp
# If tmpfile exists rm it.
[ -f $TMPFILE ] && rm -f $TMPFILE
for SERVICE in $(myfunc); do
getInfo $SERVICE > $TMPFILE # Store raw output in the TMPFILE
# I retrieve the relevant data from the TMPFILE
SERV_NAME=$(head -1 $TMPFILE | sed -e 's/ $//')
SERV_HOSTNAME=$(grep HOSTNAME $TMPFILE | cut -d "=" -f2)
SERV_ARGS=$(grep Arguments $TMPFILE | cut -d ":" -f2)
print $SERV_NAME $SEP $SERV_HOSTNAME $SEP $SERV_ARGS
rm -f $TMPFILE #rm the TMPFILE in vue of next iteration
done
Apakah ada cara, menggunakan pipa, pengalihan dan whatnots, untuk menghindari menulis file ke disk setiap kali?
Jika ini membantu, saya menggunakan ksh Versi M-11/16 / 88i
PATH
atau variabel shell atau lingkungan lainnya.TMPFILE
mungkin baik-baik saja, tetapiTMPDIR
spesial, jadi apakah Anda benar-benar ingin berjalan di atas tali itu?Jawaban:
Kode Anda terlihat seperti contoh yang sepenuhnya dibenarkan menggunakan tempfile untuk saya. Saya akan tetap: tetap dengan pendekatan ini. Satu-satunya hal yang benar-benar perlu diubah adalah cara Anda membuat tempfile. Gunakan sesuatu seperti
atau
atau setidaknya
Dengan cara ini Anda tidak akan membiarkan nama mudah diprediksi (keamanan) dan keluar campur tangan aturan antara beberapa contoh skrip berjalan pada saat yang sama.
sumber
var=$(echo lots of spaces); echo "$var"
tidak masalah dan harus menghasilkanlots of spaces
sebagai output. Peringatan sebenarnya tidak ada yang disebutkan adalah perintah strip pengganti semua baris baru. Ini bukan masalah di sini, dan hanya masalah misalnya jika Anda memiliki patahmktemp
yang membuat nama file dengan mengikuti baris baru. Pekerjaan biasa di sekitar, jika diperlukan, adalahvar=$(echo command with trailing newline; echo x); var=${var%x}
.Anda bisa menggunakan variabel:
Dari
man ksh
:Keuntungan meliputi:
sumber
man
halaman kanan (tidak disebutkan nomor versi di halaman web: /)<<<
adalah bash 'here string'. Saya tidak berpikir itu muncul di shell lain. (Oh,zsh
mungkin ...)man ksh
. Itu pasti disebutkan di sana.sleep 3 <<<"here string" & lsof -p $! | grep 0r
→sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
- ya, ini menggunakan tempfile.Anda memiliki dua opsi:
Anda mengambil data satu kali (dalam contoh Anda dengan
getInfo
) dan menyimpannya dalam file seperti yang Anda lakukan.Anda mengambil data setiap kali dan tidak menyimpannya secara lokal, yaitu, Anda menelepon
getInfo
setiap waktuSaya tidak melihat masalah dalam membuat file sementara untuk menghindari pemrosesan ulang / pengambilan ulang.
Jika Anda khawatir meninggalkan file sementara di suatu tempat, Anda selalu dapat menggunakan
trap
untuk memastikan untuk menghapusnya jika skripnya terbunuh / terganggudan gunakan
mktemp
untuk membuat nama file unik untuk file sementara Anda.sumber
Alih-alih menghasilkan file, buat pernyataan penetapan shell dan evaluasi output itu.
Atau jika Anda hanya ingin mencetak informasi:
sumber