Saya tahu saya dapat menyelesaikan masalah ini dengan beberapa cara, tetapi saya ingin tahu apakah ada cara untuk melakukannya hanya dengan menggunakan bash bawaan, dan jika tidak, apa cara paling efisien untuk melakukannya.
Saya memiliki file dengan konten seperti
AAA
B C DDD
FOO BAR
yang saya maksud hanya memiliki beberapa baris dan setiap baris mungkin memiliki spasi atau tidak. Saya ingin menjalankan perintah seperti
cmd AAA "B C DDD" "FOO BAR"
Jika saya menggunakan cmd $(< file)
Saya mengerti
cmd AAA B C DDD FOO BAR
dan jika saya menggunakan cmd "$(< file)"
Saya mengerti
cmd "AAA B C DDD FOO BAR"
Bagaimana cara agar setiap baris diperlakukan tepat satu parameter?
Jawaban yang Diterima:
Portabel:
set -f # turn off globbing
IFS='
' # split at newlines only
cmd $(cat <file)
unset IFS
set +f
Atau menggunakan subkulit untuk membuat IFS
dan opsi berubah secara lokal:
( set -f; IFS='
'; exec cmd $(cat <file) )
Shell melakukan pemisahan bidang dan pembuatan nama file pada hasil substitusi variabel atau perintah yang tidak dalam tanda kutip ganda. Jadi, Anda perlu mematikan pembuatan nama file dengan set -f
, dan konfigurasikan pemisahan bidang dengan IFS
untuk membuat hanya baris baru yang memisahkan bidang.
Tidak banyak yang bisa diperoleh dengan konstruksi bash atau ksh. Anda dapat membuat IFS
lokal ke suatu fungsi, tetapi tidak set -f
.
Di bash atau ksh93, Anda dapat menyimpan bidang dalam array, jika Anda perlu meneruskannya ke beberapa perintah. Anda perlu mengontrol ekspansi pada saat Anda membangun array. Kemudian "${a[@]}"
diperluas ke elemen larik, satu per kata.
set -f; IFS=$'n'
a=($(cat <file))
set +f; unset IFS
cmd "${a[@]}"