Saya punya skrip 'myscript' yang menampilkan sebagai berikut:
abc
def
ghi
di skrip lain, saya sebut:
declare RESULT=$(./myscript)
dan $RESULT
mendapat nilai
abc def ghi
Apakah ada cara untuk menyimpan hasilnya baik dengan baris baru, atau dengan karakter '\ n' sehingga saya dapat menampilkannya dengan ' echo -e
'?
Jawaban:
Sebenarnya, HASIL berisi apa yang Anda inginkan - untuk menunjukkan:
Apa yang Anda perlihatkan adalah apa yang Anda dapatkan dari:
Sebagaimana dicatat dalam komentar, perbedaannya adalah bahwa (1) versi variabel yang dikutip ganda (
echo "$RESULT"
) menjaga jarak internal dari nilai persis seperti yang diwakili dalam variabel - baris baru, tab, beberapa kosong, dan semua - sedangkan (2 ) versi tanpa tanda kutip (echo $RESULT
) menggantikan setiap urutan satu atau lebih kosong, tab, dan baris baru dengan satu spasi. Jadi (1) mempertahankan bentuk variabel input, sedangkan (2) menciptakan garis output tunggal yang berpotensi sangat panjang dengan 'kata-kata' yang dipisahkan oleh spasi tunggal (di mana 'kata' adalah urutan karakter non-spasi putih; diperlukan dapat berupa alfanumerik apa pun dari kata-kata ini).sumber
Perangkap lain dengan ini adalah bahwa substitusi perintah -
$()
- strip mengikuti baris baru. Mungkin tidak selalu penting, tetapi jika Anda benar-benar ingin melestarikan persis apa yang output, Anda harus menggunakan jalur lain dan beberapa mengutip:Ini sangat penting jika Anda ingin menangani semua nama file yang mungkin (untuk menghindari perilaku yang tidak terdefinisi seperti beroperasi pada file yang salah).
sumber
pwd=`pwd`; ls $pwd/$file
, Anda mendapat baris baru sebelum/
, dan menyertakan nama dalam tanda kutip ganda tidak membantu. Itu diperbaiki dengan cepat. Ini kembali pada kerangka waktu 1983-5 di ICL Perq PNX; shell tidak memiliki$PWD
variabel bawaan.Jika Anda tertarik pada baris tertentu, gunakan array hasil:
sumber
readarray
dan proses substitusi bukan substitusi perintah:readarray -t RESULT < <(./myscript>
.Selain jawaban yang diberikan oleh @ l0b0 saya hanya punya situasi di mana saya perlu untuk menjaga setiap garis akhir output baris oleh skrip dan memeriksa kode pengembalian skrip. Dan masalah dengan jawaban l0b0 adalah 'echo x' menyetel ulang $? kembali ke nol ... jadi saya berhasil menemukan solusi yang sangat licik ini:
sumber
die ()
fungsi yang menerima kode keluar yang sewenang-wenang dan opsional pesan, dan saya ingin menggunakanusage ()
fungsi lain untuk memasok pesan tetapi baris baru terus terjepit, mudah-mudahan ini memungkinkan saya mengatasi itu.Setelah mencoba sebagian besar solusi di sini, hal termudah yang saya temukan adalah yang jelas - menggunakan file temp. Saya tidak yakin apa yang ingin Anda lakukan dengan beberapa output baris Anda, tetapi Anda kemudian dapat mengatasinya baris demi baris menggunakan baca. Satu-satunya hal yang tidak dapat Anda lakukan adalah dengan mudah memasukkan semuanya ke dalam variabel yang sama, tetapi untuk sebagian besar tujuan praktis ini lebih mudah untuk ditangani.
Retas cepat untuk membuatnya melakukan tindakan yang diminta:
Perhatikan ini menambahkan garis ekstra. Jika Anda mengerjakannya, Anda dapat membuat kode di sekitarnya, saya terlalu malas.
EDIT: Meskipun kasing ini berfungsi dengan baik, orang yang membaca ini harus sadar bahwa Anda dapat dengan mudah menekan stdin di dalam loop while, sehingga memberi Anda skrip yang akan menjalankan satu baris, menghapus stdin, dan keluar. Seperti ssh akan melakukan itu menurut saya? Saya baru saja melihatnya, contoh kode lainnya di sini: /unix/24260/reading-lines-from-a-file-with-bash-for-vs- Sementara
Sekali lagi! Kali ini dengan filehandle yang berbeda (stdin, stdout, stderr adalah 0-2, jadi kita bisa menggunakan & 3 atau lebih tinggi di bash).
Anda juga dapat menggunakan mktemp, tetapi ini hanyalah contoh kode cepat. Penggunaan untuk mktemp terlihat seperti:
Kemudian gunakan $ filenamevar seperti Anda akan nama file yang sebenarnya. Mungkin tidak perlu dijelaskan di sini tetapi seseorang mengeluh dalam komentar.
sumber
bash
perangkap umum .read
ekstensi perintah-u 3
untuk membaca dari deskriptor file 3.Bagaimana dengan ini, ia akan membaca setiap baris ke variabel dan yang dapat digunakan selanjutnya! katakanlah output myscript diarahkan ke file bernama myscript_output
sumber