Saya perlu menulis skrip untuk memasukkan input multi-line ke suatu program ( psql
).
Setelah sedikit googling, saya menemukan sintaks berikut berfungsi:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Ini benar membangun string multi-line (dari BEGIN;
ke END;
, inklusif) dan pipa itu sebagai input ke psql
.
Tetapi saya tidak tahu bagaimana / mengapa itu bekerja, dapatkah seseorang menjelaskannya?
Saya merujuk terutama ke cat << EOF
, saya tahu >
output ke file, >>
menambahkan file, <
membaca input dari file.
Apa yang <<
sebenarnya dilakukan?
Dan apakah ada halaman manual untuk itu?
cat
. Cobapsql ... << EOF ...
Lihat juga "di sini string". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Stringscat
membaca stding (ketika di-pipe-kan) atau membaca file yang sesuai dengan args command lineJawaban:
Ini disebut format heredoc untuk memberikan string ke stdin. Lihat https://en.wikipedia.org/wiki/Here_document#Unix_shells untuk detail lebih lanjut.
Dari
man bash
:sumber
<<-
harap dicatat bahwa hanya karakter tab utama yang dilucuti - bukan karakter tab lunak. Ini adalah salah satu kasus langka ketika Anda benar-benar membutuhkan karakter tab. Jika sisa dokumen Anda menggunakan tab lunak, pastikan untuk menunjukkan karakter yang tidak terlihat dan (misalnya) menyalin dan menempelkan karakter tab. Jika Anda melakukannya dengan benar, penyorotan sintaks Anda harus menangkap pembatas akhir dengan benar.The
cat <<EOF
sintaks ini sangat berguna ketika bekerja dengan teks multi-baris dalam Bash, misalnya. saat menetapkan string multi-baris ke variabel shell, file atau pipa.Contoh
cat <<EOF
penggunaan sintaks di Bash:1. Tetapkan string multi-baris ke variabel shell
The
$sql
variabel sekarang memegang karakter baru-line juga. Anda dapat memverifikasi denganecho -e "$sql"
.2. Pass string multi-line ke file di Bash
The
print.sh
File sekarang berisi:3. Pass string multi-line ke pipa di Bash
The
b.txt
file berisibar
danbaz
garis. Output yang sama dicetak kestdout
.sumber
Dalam kasus Anda, "EOF" dikenal sebagai "Tag Di Sini". Pada dasarnya
<<Here
memberitahu shell bahwa Anda akan memasukkan string multiline sampai "tag"Here
. Anda dapat memberi nama tag ini seperti yang Anda inginkan, seringEOF
atauSTOP
.Beberapa aturan tentang tag Di Sini:
contoh:
sumber
<<-
digunakan tab terkemuka tidak akan mencegah tag dari dikenaliPOSIX 7
kennytm dikutip
man bash
, tetapi sebagian besar juga POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :Contohnya
Beberapa contoh belum diberikan.
Kutipan mencegah ekspansi parameter
Tanpa kutipan:
Keluaran:
Dengan kutipan:
atau (jelek tapi valid):
Output:
Tanda hubung menghapus tab utama
Tanpa tanda hubung:
di mana
<tab>
tab literal, dan dapat dimasukkan denganCtrl + V <tab>
Keluaran:
Dengan tanda hubung:
Keluaran:
Ini ada tentu saja sehingga Anda dapat indentasi
cat
seperti kode di sekitarnya, yang lebih mudah dibaca dan dipelihara. Misalnya:Sayangnya, ini tidak berfungsi untuk karakter luar angkasa: POSIX
tab
indentasi disukai di sini. Astaga.sumber
<<-
dan<tab>a
, harus dicatat bahwa tujuannya adalah untuk memungkinkan lekukan normal kode dalam skrip sambil memungkinkan teks heredoc disajikan untuk proses penerimaan dimulai pada kolom 0. Ini adalah fitur yang tidak terlalu umum terlihat dan sedikit lebih banyak konteks dapat mencegah banyak hal menggaruk kepala ...$
"$a"'$b'"$c"
, tetapi tidak ada analog di sini AFAIK.Menggunakan tee bukan kucing
Tidak persis sebagai jawaban untuk pertanyaan awal, tetapi saya tetap ingin berbagi ini: Saya harus membuat file konfigurasi di direktori yang memerlukan hak root.
Berikut ini tidak berfungsi untuk kasus itu:
karena pengalihan ditangani di luar konteks sudo.
Saya akhirnya menggunakan ini sebagai gantinya:
sumber
Sedikit ekstensi untuk jawaban di atas. Trailing
>
mengarahkan input ke file, menimpa konten yang ada. Namun, satu penggunaan khusus yang nyaman adalah panah ganda>>
yang ditambahkan, menambahkan konten baru Anda ke akhir file, seperti pada:Ini meluas
fstab
tanpa Anda harus khawatir tentang memodifikasi kontennya secara tidak sengaja.sumber
Ini tidak selalu merupakan jawaban untuk pertanyaan awal, tetapi berbagi beberapa hasil dari pengujian saya sendiri. Ini:
akan menghasilkan file yang sama dengan:
Jadi, saya tidak melihat gunanya menggunakan perintah cat.
sumber
<<test
tanpacat <<test
.Perlu dicatat bahwa di sini dokumen juga berfungsi dalam bash loop. Contoh ini menunjukkan cara mendapatkan daftar kolom tabel:
atau bahkan tanpa baris baru
sumber