Sunting: judul asli "dibaca gagal di bash"
Dengan ksh saya menggunakan baca sebagai cara mudah untuk memisahkan nilai:
$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a
2 1
$
Tapi gagal di bash:
$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a
$
Saya tidak menemukan alasan di halaman manual mengapa gagal, tahu?
Jawaban:
bash
menjalankan sisi kanan pipeline dalam konteks subshell , jadi perubahan variabel (yang memangread
dilakukan) tidak dipertahankan - mereka mati ketika subshell melakukannya, di akhir perintah.Sebagai gantinya, Anda dapat menggunakan substitusi proses :
Dalam hal ini,
read
berjalan di dalam shell utama kami, dan perintah penghasil output kami berjalan di subkulit. The<(...)
sintaks menciptakan subkulit dan menghubungkan output ke pipa, yang kita mengarahkan ke input dariread
dengan biasa<
operasi . Karenaread
dijalankan di shell utama kita, variabel diatur dengan benar.Seperti yang ditunjukkan dalam komentar, jika tujuan Anda adalah untuk membagi string menjadi variabel, Anda dapat menggunakan string di sini :
Saya berasumsi ada lebih dari itu, tetapi ini adalah pilihan yang lebih baik jika tidak ada.
sumber
read a b dump <<< '1 2 3 4 5'
.cat /etc/passwd | (read -r line ; echo $line)
. Tapi berikutnyaecho
dari$line
yang tidak dalam pipa put apa-apa di layar, karena nilai itu ada hanya antara tanda kurung (subkulit). Semoga, ini membantu seseorang.Ini bukan
bash
bug yangPOSIX
memungkinkan keduanyabash
danksh
perilaku, yang mengarah ke ketidaksesuaian malang yang Anda amati.http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_12
Selain itu, setiap perintah pipa multi-perintah berada dalam lingkungan subkulit; sebagai ekstensi, bagaimanapun, setiap atau semua perintah dalam pipa dapat dieksekusi di lingkungan saat ini. Semua perintah lain harus dijalankan di lingkungan shell saat ini.
Namun, dengan
bash 4.2
dan yang lebih baru, Anda dapat mengaturlastpipe
opsi dalam skrip non interaktif untuk mendapatkan hasil yang diharapkan, misalnya:Keluaran:
sumber
lastpipe
adalah tidak bekerja di shell lain (mis. dash). pada dasarnya tidak ada cara untuk melakukan portable ini dari menjalankan segala sesuatu dalam subkulit itu, lihat stackoverflow.com/questions/36268479/…