GNU/Linux >> Belajar Linux >  >> Linux

Skrip Vs Satu Baris?

Saya telah memperhatikan banyak pertanyaan dan jawaban serta komentar yang mengungkapkan penghinaan terhadap (dan terkadang bahkan ketakutan) menulis skrip alih-alih satu kalimat. Jadi, saya ingin tahu:

  • Kapan dan mengapa saya harus menulis skrip yang berdiri sendiri daripada "one-liner"? Atau sebaliknya?

  • Apa kasus penggunaan dan pro &kontra dari keduanya?

  • Apakah beberapa bahasa (mis. awk atau Perl) lebih cocok untuk satu baris daripada yang lain (mis. python)? Jika ya, mengapa?

  • Apakah ini hanya masalah preferensi pribadi atau adakah alasan yang baik (yaitu objektif) untuk menulis satu atau yang lain dalam keadaan tertentu? Apa alasannya?

Definisi

  • one-liner :urutan perintah apa pun yang diketik atau ditempelkan langsung ke baris perintah shell . Seringkali melibatkan saluran pipa dan/atau penggunaan bahasa seperti sed , awk , perl , dan/atau alat seperti grep atau cut atau sort .

    Ini adalah eksekusi langsung pada baris perintah yang merupakan karakteristik yang menentukan – panjang dan pemformatan tidak relevan. "Satu baris" mungkin semuanya dalam satu baris, atau mungkin memiliki beberapa baris (misalnya sh untuk loop, atau kode awk atau sed yang disematkan, dengan umpan baris dan lekukan untuk meningkatkan keterbacaan).

  • script :urutan perintah apa pun dalam bahasa yang ditafsirkan apa pun yang disimpan ke dalam file , dan kemudian dieksekusi. Sebuah skrip dapat ditulis seluruhnya dalam satu bahasa, atau mungkin berupa pembungkus skrip shell di sekitar beberapa "satu baris" menggunakan bahasa lain.

Saya memiliki jawaban saya sendiri (yang akan saya posting nanti), tetapi saya ingin ini menjadi Q&A kanonik tentang masalah ini, bukan hanya pendapat pribadi saya.

Jawaban yang Diterima:

Tanggapan lain berdasarkan pengalaman praktis.

Saya akan menggunakan one-liner jika itu adalah kode "buang" yang bisa saya tulis langsung saat diminta. Misalnya, saya mungkin menggunakan ini:

for h in host1 host2 host3; do printf "%s\t%s\n" "$h" "$(ssh "$h" uptime)"; done

Saya akan menggunakan skrip jika saya memutuskan bahwa kode itu layak disimpan. Pada titik ini saya akan menambahkan deskripsi di bagian atas file, mungkin menambahkan beberapa pemeriksaan kesalahan, dan mungkin bahkan memeriksanya ke dalam repositori kode untuk versi. Misalnya, jika saya memutuskan bahwa memeriksa uptime dari satu set server adalah fungsi yang berguna yang akan saya gunakan lagi dan lagi, satu baris di atas mungkin diperluas menjadi ini:

#!/bin/bash
# Check the uptime for each of the known set of hosts
########################################################################
#
hosts=(host1 host2 host3)

for h in "${hosts[@]}"
do
    printf "%s\t" "$h"
    uptime=$(ssh -o ConnectTimeout=5 -n "$h" uptime 2>/dev/null)
    printf "%s\n" "${uptime:-(unreachable)}"
done

Generalisasi, bisa dibilang

  • Satu kalimat

    • Kode sederhana (yaitu hanya pernyataan “beberapa”), ditulis untuk tujuan khusus yang hanya sekali
    • Kode yang dapat ditulis dengan cepat dan mudah kapan pun dibutuhkan
    • Kode sekali pakai
  • Skrip

    • Kode yang (mungkin) akan digunakan lebih dari sekali atau dua kali
    • Kode kompleks yang memerlukan lebih dari "beberapa" pernyataan
    • Kode yang perlu dikelola oleh orang lain
    • Kode untuk dipahami oleh orang lain
    • Kode yang akan dijalankan tanpa pengawasan (misalnya, dari cron )

Saya melihat cukup banyak pertanyaan di sini di unix.SE meminta one-liner untuk melakukan tugas tertentu. Dengan menggunakan contoh saya di atas, saya pikir yang kedua jauh lebih mudah dipahami daripada yang pertama, dan oleh karena itu pembaca dapat belajar lebih banyak darinya. Satu solusi dapat dengan mudah diturunkan dari yang lain sehingga untuk kepentingan keterbacaan (untuk pembaca di masa mendatang) kita mungkin harus menghindari penyediaan kode yang terjepit dalam satu baris untuk apa pun selain solusi yang paling sepele.

Terkait:ekspansi nama path bash/Shell untuk mkdir, sentuh dll?
Linux
  1. Bagaimana Cara Men-debug Skrip Bash?

  2. Waktu Habis Dalam Skrip Shell?

  3. Cara Menyematkan Biner yang Dapat Dieksekusi Dalam Skrip Shell Tanpa Alat Ekstra?

  1. Tidak Dapat Mendapatkan Kode Keluar yang Tepat Dari Script?

  2. Layanan OS Linux 'scsi_reserve'

  3. Cara menguji skrip PHP

  1. Direktori skrip Shell saat ini?

  2. Bagaimana cara mengeksekusi kode di shell Django dengan skrip python eksternal?

  3. Skrip mulai systemd postgresql