Saya ingin mencetak kode ke dalam file menggunakan kucing <<EOF >>
:
cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi
EOF
tapi ketika saya cek file output, saya mendapatkan ini:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Aku mencoba menempatkan tanda kutip tunggal tetapi output juga membawa tanda kutip tunggal dengan itu. Bagaimana saya bisa menghindari masalah ini?
Anda hanya perlu sedikit perubahan; single-quote di sini-dokumen pembatas setelah <<
.
cat <<'EOF' >> brightup.sh
atau ekuivalen backslash-melarikan diri itu:
cat <<\EOF >>brightup.sh
Tanpa mengutip, berikut dokumen akan menjalani substitusi variabel, backticks akan dievaluasi, dll, seperti yang anda temukan.
Jika anda perlu untuk memperluas beberapa, tapi tidak semua, nilai-nilai, anda perlu untuk secara individual melarikan diri orang-orang yang anda ingin mencegah.
cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF
akan menghasilkan
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Seperti yang disarankan oleh @fedorqui, di sini adalah bagian yang relevan dari man bash
:
Berikut Dokumen
jenis pengalihan memerintahkan shell untuk membaca input dari sumber arus sampai baris yang hanya berisi pembatas (dengan tidak ada trailing kosong) terlihat. Semua lini baca sampai ke titik itu adalah kemudian digunakan sebagai standar input untuk perintah.
format berikut-dokumen adalah:
<<[-]kata di sini-dokumen pembatas
Tidak ada parameter ekspansi, perintah substitusi, aritmatika ekspansi, atau path ekspansi ini dilakukan pada kata-kata. Jika setiap karakter dalam kata dikutip, pembatas adalah hasil dari kutipan penghapusan pada kata-kata, dan garis di sini-dokumen yang tidak diperluas. Jika kata dikutp, semua lini di sini-dokumen yang dikenakan untuk parameter ekspansi, perintah substitusi, dan aritmatika ekspansi. Di kasus terakhir, urutan karakter \
diabaikan, dan \ harus digunakan untuk mengutip karakter \, $, dan `.
Atau, menggunakan EOF spidol, anda perlu untuk penawaran awal penanda agar perluasan tidak't harus dilakukan:
#-----v---v------
cat <<'EOF' >> brightup.sh
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi
EOF
IHTH
Ini harus bekerja, aku hanya diuji dan bekerja seperti yang diharapkan: tidak ada ekspansi, substitusi, atau apa-yang-anda berlangsung.
cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want.
Menggunakan berikut juga bekerja.
cat <<< ' > file
... code ...'
Juga, it's dicatat bahwa ketika menggunakan heredocs, seperti << EOF
, substitusi dan variabel perluasan dan sejenisnya berlangsung. Jadi melakukan sesuatu seperti ini:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
akan selalu mengakibatkan perluasan variabel $HOME
dan $PWD
. Jadi jika anda home directory /home/foobar
dan saat ini path /home/foobar/bin
, file
akan terlihat seperti ini:
cd "/home/foobar"
echo "/home/foobar/bin"
bukan yang diharapkan:
cd "$HOME"
echo "$PWD"