Cara Menggunakan "Dokumen Di Sini" di Bash di Linux

Diterbitkan: 2022-01-29
Jendela terminal pada sistem komputer Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Anehnya bernama "di sini dokumen" memungkinkan Anda menggunakan pengalihan input/out di dalam skrip Bash di Linux. Mereka adalah cara yang bagus untuk mengotomatisasi perintah yang Anda perlukan untuk dijalankan di komputer jarak jauh.

Berikut Dokumen

Banyak perintah di Linux memiliki dua atau tiga nama huruf. Ini sebagian yang memunculkan anggapan bahwa Linux sulit dipelajari dan penuh dengan perintah misterius. Tapi salah satu nama teraneh di Linux bukanlah salah satu yang samar-samar. "Dokumen di sini" bukanlah dokumen, dan juga tidak terlalu jelas apa yang dimaksud dengan "di sini".

Mereka adalah konstruksi yang relatif tidak jelas, tetapi mereka berguna. Tentu saja, ini Linux, jadi ada lebih dari satu cara untuk menguliti kucing. Beberapa fungsi yang disediakan oleh dokumen di sini dapat direproduksi dengan cara lain. Metode alternatif tersebut biasanya lebih rumit. Dalam pemrograman dan skrip, "lebih rumit" juga berarti "lebih rentan terhadap bug," dan kode Anda lebih sulit untuk dipelihara.

Di mana di sini dokumen yang benar-benar unggul adalah dalam otomatisasi perintah yang ingin Anda kirim ke komputer jarak jauh dari koneksi yang dibuat dari dalam skrip. Membuat koneksi itu mudah, tetapi setelah koneksi dibuat, bagaimana Anda "memompa" perintah Anda dari skrip Anda ke shell di komputer jarak jauh? Di sini dokumen memungkinkan Anda melakukannya dengan sangat sederhana.

Prinsip Dasar Dokumen Here

Representasi idiomatik dari dokumen di sini terlihat seperti ini:

 PERINTAH << batas_string
 .
 .
teks 
data
variabel
.
.
batas_string
  • COMMAND : Ini bisa berupa perintah Linux apa pun yang menerima input yang dialihkan. Catatan, perintah echo tidak menerima input yang dialihkan. Jika Anda perlu menulis ke layar, Anda dapat menggunakan perintah cat .
  • << : Operator pengalihan.
  • limit_string : Ini adalah label. Itu bisa apa saja yang Anda suka selama itu tidak muncul dalam daftar data yang Anda arahkan ke perintah. Digunakan untuk menandai akhir dari teks, data, dan daftar variabel.
  • Data List : Daftar data yang akan dimasukkan ke perintah. Itu bisa berisi perintah, teks, dan variabel. Isi dari daftar data dimasukkan ke dalam perintah satu baris pada satu waktu sampai _limit_string ditemukan.
Iklan

Anda mungkin akan melihat contoh dokumen di sini yang menggunakan "EOF" sebagai string batas. Kami tidak mendukung pendekatan itu. Ini berfungsi, tetapi "EOF" berarti "Akhir File." Terlepas dari kasus yang jarang terjadi di mana dokumen rumah adalah hal terakhir dalam file skrip, "EOF" digunakan secara keliru.

Ini akan membuat skrip Anda lebih mudah dibaca jika Anda menggunakan string batas yang mengacu pada apa yang Anda lakukan. Jika Anda mengirim serangkaian perintah ke komputer jarak jauh melalui Secure Shell (SSH), string batas yang disebut sesuatu seperti “_remote_commands” akan sangat masuk akal. Anda tidak perlu memulainya dengan karakter garis bawah “ _ ”. Kami melakukannya karena itu menandai mereka sebagai sesuatu yang tidak biasa dalam naskah Anda.

Contoh Sederhana

Anda dapat menggunakan dokumen di sini pada baris perintah dan dalam skrip. Saat Anda mengetik berikut ini di jendela terminal, Anda akan melihat prompt kelanjutan baris “ > ” setiap kali Anda menekan “Enter.” Saat Anda mengetik string batas “_end_of_text” dan menekan “Enter,” daftar situs web diteruskan ke cat, dan mereka ditampilkan di jendela terminal.

 kucing << _end_of_text 
Bagaimana-Untuk Geek 
Tinjau Geek 
LifeSavvy 
CloudSavvy IT
PikiranBounce
_end_of_text 

Itu bukan latihan yang paling berharga, tetapi itu menunjukkan bahwa tidak ada yang dikirim ke perintah sampai seluruh daftar data dikumpulkan dan string batas ditemukan. Perintah cat tidak menerima input apa pun sampai Anda memasukkan string batas “_end_of_text” dan menekan tombol “Enter”.

Kita dapat melakukan hal yang sama dalam sebuah skrip. Ketik atau salin contoh ini ke editor, simpan file sebagai "heredoc-1.sh", dan tutup editor.

 #!/bin/bash

kucing << "_akhir_teks_"
Nama pengguna Anda adalah: $(whoami)
Direktori kerja Anda saat ini adalah: $PWD
Versi Bash Anda adalah: $BASH_VERSION
_end_of_text

Saat Anda mengikuti artikel ini, setiap kali Anda membuat skrip, Anda harus membuatnya dapat dieksekusi sebelum dijalankan. Dalam setiap kasus, gunakan perintah chmod . Ganti nama skrip di setiap contoh untuk nama skrip yang digunakan di sini.

 chmod +x heredoc-1.sh 

Iklan

Skrip ini berisi dua variabel lingkungan, $PWD dan $BASH_VERSION . Nama variabel lingkungan diganti dengan nilai datanya—direktori kerja saat ini dan versi Bash—saat skrip dijalankan.

Script juga menggunakan substitusi perintah pada perintah whoami . Nama perintah diganti dengan outputnya sendiri. Output dari seluruh skrip ditulis ke jendela terminal dengan perintah cat. Kami menjalankan skrip dengan memanggilnya dengan nama:

 ./heredoc-1.sh 

Jika Anda memodifikasi skrip dan membungkus string batas di baris pertama dokumen di sini dalam tanda kutip ” " “, daftar data diteruskan ke perintah dokumen di sini kata demi kata. Nama variabel ditampilkan alih-alih nilai variabel, dan substitusi perintah akan tidak berlangsung.

 #!/bin/bash

cat <<- "_end_of_text"
Nama pengguna Anda adalah: $(whoami)
Direktori kerja Anda saat ini adalah: $PWD
Versi Bash Anda adalah: $BASH_VERSION
_end_of_text
 ./heredoc-1.sh 

Menangani Karakter Tab

Secara default, karakter tab dalam daftar data Anda akan disimpan dan ditulis ke jendela terminal. Salin dan simpan contoh ini sebagai “heredoc-2.sh.” Jadikan itu dapat dieksekusi menggunakan perintah chmod . Edit garis indentasi untuk memastikan bahwa mereka memiliki satu atau dua karakter tab di awal baris, bukan serangkaian spasi.

 #!/bin/bash

kucing << _end_of_text
Nama pengguna Anda adalah: $(whoami)
  Direktori kerja Anda saat ini adalah: $PWD
    Versi Bash Anda adalah: $BASH_VERSION
_end_of_text
 ./heredoc-2.sh 

Tab ditulis ke jendela terminal.

Dengan menambahkan tanda hubung “ - ” ke operator pengalihan, dokumen di sini akan mengabaikan karakter tab di depan. Simpan contoh ini sebagai "heredoc-3.sh" dan buat itu bisa dieksekusi.

 #!/bin/bash

kucing <<- _end_of_text
Nama pengguna Anda adalah: $(whoami)
  Direktori kerja Anda saat ini adalah: $PWD
    Versi Bash Anda adalah: $BASH_VERSION
_end_of_text
 ./heredoc-3.sh 

Tab diabaikan. Ini mungkin tampak sepele, tetapi ini adalah cara yang rapi untuk mengatasi tab awal karena bagian skrip yang menjorok.

Iklan

Loop dan konstruksi logis lainnya biasanya menjorok. Jika dokumen Anda di sini terdapat di bagian skrip yang menjorok, menggunakan tanda hubung “ - ” dengan operator pengalihan akan menghapus masalah pemformatan yang disebabkan oleh karakter tab utama.

 #!/bin/bash

jika benar; kemudian
  kucing <<- _limit_string
  Baris 1 dengan tab terdepan.
  Baris 2 dengan tab terdepan.
  Baris 3 dengan tab terdepan.
  _batas_string
fi

Mengarahkan ke File

Output dari perintah yang digunakan dengan dokumen di sini dapat diarahkan ke file. Gunakan “ > ” (buat file) atau “ >> ” (buat file jika tidak ada, tambahkan ke file jika ada) operator pengalihan setelah string batas di baris pertama dokumen di sini.

Skrip ini adalah "heredoc-4.sh." Ini akan mengarahkan outputnya ke file teks yang disebut "session.txt."

 #!/bin/bash

cat << _end_of_text > session.txt
Nama pengguna Anda adalah: $(whoami)
Direktori kerja Anda saat ini adalah: $PWD
Versi Bash Anda adalah: $BASH_VERSION
_end_of_text
 ./heredoc-4.sh
 sesi kucing.text 

Piping Output ke Perintah Lain

Output dari perintah yang digunakan dalam dokumen di sini dapat disalurkan sebagai input ke perintah lain. Gunakan pipa “ | ” operator setelah string batas di baris pertama dokumen di sini. Kami akan menyalurkan output dari perintah dokumen di sini, cat , ke sed . Kami ingin mengganti semua kemunculan huruf "a" dengan huruf "e".

Beri nama skrip ini "heredoc-5.sh."

 #!/bin/bash

cat << _end_of_text | sed 's/a/e/g'
Bagaimana
Ke
gaak
_end_of_text
 ./heredoc-5.sh

"Gaak" dikoreksi menjadi "Geek."

Mengirim Parameter ke Fungsi

Perintah yang digunakan dengan dokumen di sini dapat berupa fungsi dalam skrip.

Script ini melewatkan beberapa data kendaraan ke dalam sebuah fungsi. Fungsi membaca data seolah-olah telah diketik oleh pengguna. Nilai dari variabel tersebut kemudian dicetak. Simpan skrip ini sebagai "heredoc-6.sh".

 #!/bin/bash

# fungsi set_car_details()
set_mobil_detail ()
{
baca make
membaca model
baca baru_bekas
baca delivery_collect
baca lokasi
baca harga
}

# Dokumen di sini yang meneruskan data ke set_car_details()
set_car_details << _mars_rover_data
NASA
Penjelajah Ketekunan
Digunakan
Mengumpulkan
Mars (panjang, lat) 77.451865,18.445161
2,2 miliar
_mars_rover_data

# Ambil detail kendaraan
echo "Buat: $buat"
echo "Model: $model"
echo "Baru atau Bekas: $new_used"
echo "Pengiriman atau Koleksi: $delivery_collect"
echo "Lokasi: $lokasi"
echo "Harga \$: $harga"
 ./heredoc-6.sh 

Rincian kendaraan ditulis ke jendela terminal.

Membuat dan Mengirim Email

Kita dapat menggunakan dokumen di sini untuk menulis dan mengirim email. Perhatikan bahwa kita dapat meneruskan parameter ke perintah di depan operator pengalihan. Kami menggunakan perintah mail Linux untuk mengirim email melalui sistem email lokal ke akun pengguna yang disebut "dave". Opsi -s (subjek) memungkinkan kita untuk menentukan subjek email.

Contoh ini membentuk skrip "heredoc-7.sh."

 #!/bin/bash

artikel="Ini Dokumen"

mail -s 'Status beban kerja' dave << _project_report
Nama pengguna: $(whoami)
Telah menyelesaikan tugas:
Artikel: $artikel
_laporan proyek
 ./heredoc-7.sh 

Iklan

Tidak ada output yang terlihat dari skrip ini. Tetapi ketika kami memeriksa surat kami, kami melihat bahwa email itu dibuat, dikirim, dan dikirim.

 surat 

Menggunakan Dokumen Di Sini dengan SSH

Di sini dokumen adalah cara yang ampuh dan nyaman untuk menjalankan beberapa perintah pada komputer jarak jauh setelah koneksi SSH dibuat. Jika Anda telah mengatur kunci SSH antara dua komputer, proses login akan sepenuhnya otomatis. Dalam contoh cepat dan kotor ini, Anda akan dimintai sandi untuk akun pengguna di komputer jarak jauh.

Skrip ini adalah "heredoc-8.sh". Kita akan terhubung ke komputer jarak jauh yang disebut "remote-pc". Akun pengguna disebut "dave". Kami menggunakan opsi -T (nonaktifkan alokasi terminal semu) karena kami tidak memerlukan terminal semu interaktif untuk ditugaskan kepada kami.

Di bagian skrip "lakukan beberapa pekerjaan di sini", kita dapat melewati daftar perintah, dan ini akan dieksekusi di komputer jarak jauh. Tentu saja, Anda bisa memanggil skrip yang ada di komputer jarak jauh. Skrip jarak jauh dapat menampung semua perintah dan rutinitas yang ingin Anda jalankan.

Semua yang akan dilakukan skrip kita—heredoc-8.sh—adalah memperbarui log koneksi di komputer jarak jauh. Akun pengguna dan cap waktu dan tanggal dicatat ke file teks.

 #!/bin/bash

ssh -T [email protected] << _remote_commands

# lakukan beberapa pekerjaan di sini

# perbarui log koneksi
echo $USER "-" $(tanggal) >> /home/dave/conn_log/script.log
_remote_commands
Iklan

Saat kami menjalankan perintah, kami dimintai kata sandi untuk akun di komputer jarak jauh .

 ./heredoc-8.sh 

Beberapa informasi tentang komputer jarak jauh ditampilkan, dan kami kembali ke prompt perintah.

Di komputer jarak jauh , kita dapat menggunakan cat untuk memeriksa log koneksi:

 cat conn_log/script.log 

Setiap koneksi terdaftar untuk kami.

TERKAIT: Cara Membuat dan Menginstal Kunci SSH Dari Shell Linux

Nama Aneh, Fitur Rapi

Di sini dokumen unik tetapi kuat, terutama ketika digunakan untuk mengirim perintah ke komputer jarak jauh. Ini akan menjadi masalah sederhana untuk membuat skrip rutinitas pencadangan menggunakan rsync . Skrip kemudian dapat terhubung ke komputer jarak jauh, memeriksa ruang penyimpanan yang tersisa, dan mengirim email peringatan jika ruang hampir habis.

TERKAIT: Cara Mencadangkan Sistem Linux Anda Dengan rsync