GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara cat <<EOF >> file yang berisi kode?

Seharusnya ini berhasil, saya baru saja mengujinya dan berfungsi seperti yang diharapkan:tidak ada perluasan, penggantian, atau apa pun yang terjadi.

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 yang berikut ini juga berfungsi.

cat <<< ' > file
 ... code ...'

Juga, perlu dicatat bahwa ketika menggunakan heredocs, seperti << EOF , substitusi dan ekspansi variabel dan sejenisnya terjadi. Jadi lakukan sesuatu seperti ini:

cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

akan selalu menghasilkan perluasan variabel $HOME dan $PWD . Jadi jika direktori home Anda adalah /home/foobar dan jalur saat ini adalah /home/foobar/bin , file akan terlihat seperti ini:

cd "/home/foobar"
echo "/home/foobar/bin"

bukannya yang diharapkan:

cd "$HOME"
echo "$PWD"

Anda hanya membutuhkan sedikit perubahan; tanda kutip pembatas dokumen di sini setelah << .

cat <<'EOF' >> brightup.sh

atau setara dengan backslash-escape:

cat <<\EOF >>brightup.sh

Tanpa mengutip, dokumen di sini akan menjalani penggantian variabel, backticks akan dievaluasi, dll, seperti yang Anda temukan.

Jika Anda perlu memperluas beberapa, tetapi tidak semua, nilai, Anda perlu meng-escape satu per satu dari nilai yang ingin Anda cegah.

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, berikut adalah bagian yang relevan dari man bash :

Ini Dokumen

Jenis redirection ini menginstruksikan shell untuk membaca input dari sumber saat ini hingga baris yang hanya berisi pembatas (tanpa railing blank) terlihat. Semua baris yang dibaca hingga saat itu kemudian digunakan sebagai input standar untuk sebuah perintah.

Format dokumen di sini adalah:

      <<[-]word
              here-document
      delimiter

Tidak ada perluasan parameter, substitusi perintah, perluasan aritmatika, atau perluasan nama jalur yang dilakukan pada kata. Jika ada karakter dalam kata yang dikutip, pembatasnya adalah hasil dari penghapusan kutipan pada kata, dan baris dalam dokumen di sini tidak diperluas. Jika kata tidak dikutip, semua baris dokumen di sini akan mengalami perluasan parameter, substitusi perintah, dan perluasan aritmatika . Dalam kasus terakhir, urutan karakter \<newline> diabaikan, dan \ harus digunakan untuk mengutip karakter \ , $ , dan ` .


Linux
  1. Cara grep \n dalam file

  2. Bagaimana saya bisa menyimpan file dan menghapus baris yang dikomentari?

  3. Bagaimana cara menyalin file secara transaksional?

  1. Bagaimana Cara Memindahkan 100 File Dari Folder Yang Berisi Ribuan?

  2. Bagaimana Cara Cat File Dari Awk?

  3. Bagaimana Mengganti Nama File di Linux?

  1. Bagaimana Cara Mengubah Nama File yang Mengandung Karakter?

  2. Bagaimana cara kerja cat << EOF di bash?

  3. Bagaimana cara membuat file jarang?