Bagaimana saya bisa menulis dokumen di sini ke file dalam skrip Bash?
Bagaimana saya bisa menulis dokumen di sini ke file dalam skrip Bash?
Jawaban:
Baca Panduan Script Advanced Bash Bab 19. Berikut Dokumen .
Berikut adalah contoh yang akan menulis konten ke file di /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Perhatikan bahwa 'EOF' akhir (The LimitString
) tidak boleh memiliki spasi putih di depan kata, karena itu berarti bahwaLimitString
tidak akan dikenali.
Dalam skrip shell, Anda mungkin ingin menggunakan lekukan untuk membuat kode dapat dibaca, namun ini dapat memiliki efek yang tidak diinginkan dari indentasi teks dalam dokumen Anda di sini. Dalam hal ini, gunakan <<-
(diikuti oleh tanda hubung) untuk menonaktifkan tab terkemuka ( Perhatikan bahwa untuk menguji ini, Anda perlu mengganti spasi putih terkemuka dengan karakter tab , karena saya tidak dapat mencetak karakter tab yang sebenarnya di sini.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Jika Anda tidak ingin menafsirkan variabel dalam teks, gunakan tanda kutip tunggal:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Untuk menyalurkan heredoc melalui pipa perintah:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
Keluaran:
foo
bbr
bbz
... atau untuk menulis heredoc ke file menggunakan sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
, apa sebutan mereka?
<<<
disebut 'Here Strings'. Kode like tr a-z A-Z <<< 'one two three'
akan menghasilkan string ONE TWO THREE
. Informasi lebih lanjut di en.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
bukan <<EOF
.
Alih-alih menggunakan cat
dan pengalihan I / O itu mungkin berguna untuk digunakan tee
sebagai gantinya:
tee newfile <<EOF
line 1
line 2
line 3
EOF
Ini lebih ringkas, ditambah tidak seperti operator pengalihan, dapat dikombinasikan dengan sudo
jika Anda perlu menulis ke file dengan izin root.
> /dev/null
di akhir baris pertama untuk mencegah konten file di sini ditampilkan ke stdout ketika itu dibuat.
sudo
, bukan karena singkatnya :-)
man tee
. Gunakan -a
bendera untuk menambahkan alih-alih menimpa.
catatan:
Pertanyaan (bagaimana cara menulis dokumen di sini (alias heredoc ) ke file dalam skrip bash?) Memiliki (setidaknya) 3 dimensi atau sub -pertanyaan independen utama:
root
) memiliki file?(Ada dimensi lain / subquestions yang saya anggap tidak penting. Pertimbangkan untuk mengedit jawaban ini untuk menambahkannya!) Berikut adalah beberapa kombinasi yang lebih penting dari dimensi pertanyaan yang tercantum di atas, dengan berbagai pengidentifikasi pembatasan yang berbeda - tidak ada apa-apa keramat EOF
, pastikan string yang Anda gunakan sebagai pengidentifikasi batas Anda tidak muncul di dalam heredoc Anda:
Untuk menimpa file yang ada (atau menulis ke file baru) yang Anda miliki, gantikan referensi variabel di dalam heredoc:
cat << EOF > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
Untuk menambahkan file yang ada (atau menulis ke file baru) yang Anda miliki, gantikan referensi variabel di dalam heredoc:
cat << FOE >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
FOE
Untuk menimpa file yang ada (atau menulis ke file baru) yang Anda miliki, dengan konten literal dari heredoc:
cat << 'END_OF_FILE' > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
END_OF_FILE
Untuk menambahkan file yang ada (atau menulis ke file baru) yang Anda miliki, dengan konten literal dari heredoc:
cat << 'eof' >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
eof
Untuk menimpa file yang ada (atau menulis ke file baru) yang dimiliki oleh root, gantikan referensi variabel di dalam heredoc:
cat << until_it_ends | sudo tee /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
Untuk menambahkan file yang ada (atau menulis ke file baru) yang dimiliki oleh pengguna = foo, dengan konten literal dari heredoc:
cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
Screw_you_Foo
-a
== --append
; yaitu, tee -a
-> tee
. Lihat info tee
(saya akan mengutipnya di sini, tetapi markup komentar terlalu terbatas.
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
bukannya EOF
dalam contoh append?
Untuk membangun jawaban @ Livven , berikut adalah beberapa kombinasi yang berguna.
substitusi variabel, tab utama dipertahankan, menimpa file, gema ke stdout
tee /path/to/file <<EOF
${variable}
EOF
tidak ada substitusi variabel , mempertahankan tab terkemuka, menimpa file, gema ke stdout
tee /path/to/file <<'EOF'
${variable}
EOF
substitusi variabel, tab terkemuka dihapus , menimpa file, gema ke stdout
tee /path/to/file <<-EOF
${variable}
EOF
substitusi variabel, tab utama dipertahankan, tambahkan ke file , gema ke stdout
tee -a /path/to/file <<EOF
${variable}
EOF
substitusi variabel, tab utama dipertahankan, menimpa file, tidak ada gema ke stdout
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
di atas dapat dikombinasikan dengan sudo
juga
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Saat izin root diperlukan untuk file tujuan, gunakan |sudo tee
alih-alih >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Untuk orang-orang masa depan yang mungkin memiliki masalah ini, format berikut berfungsi:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf
cat << END > afile
diikuti oleh heredoc berfungsi dengan baik.
cat
seperti yang ditunjukkan pada jawaban yang diterima.
cat
berjalan di dalam subkulit, dan semua output dari subkulit yang diarahkan ke file
Sebagai contoh, Anda dapat menggunakannya:
Pertama (membuat koneksi ssh):
while read pass port user ip files directs; do
sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
PASS PORT USER IP FILES DIRECTS
. . . . . .
. . . . . .
. . . . . .
PASS PORT USER IP FILES DIRECTS
____HERE
Kedua (menjalankan perintah):
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
Ketiga (menjalankan perintah):
Script=$'
#Your commands
'
while read pass port user ip; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
done <<___HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
___HERE
Keempat (menggunakan variabel):
while read pass port user ip fileoutput; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput
#Your command > $fileinput
ENDSSH1
done <<____HERE
PASS PORT USER IP FILE-OUTPUT
. . . . .
. . . . .
. . . . .
PASS PORT USER IP FILE-OUTPUT
____HERE