Pelajari Perbedaan Antara Sourcing dan Forking di Bash


Fokus utama artikel ini adalah untuk memahami dengan jelas apa yang terjadi ketika Anda menjalankan skrip vs sumber skrip di bash. Pertama, kita akan memahami dengan jelas bagaimana program dikirimkan ketika kita memanggil skrip dengan cara yang berbeda.

CATATAN: membuat skrip dengan ekstensi tidak menjadi masalah. Script akan berjalan dengan baik meskipun tanpa ekstensi.

Pada dasarnya, setiap skrip dimulai dengan baris yang disebut shebang(#!). Simbol Hash di bash akan diartikan sebagai komentar tetapi shebang memiliki arti khusus. Ia memberitahu bash untuk mengirimkan program dalam penerjemah apa pun yang Anda sebutkan di shebang.

Di bawah ini adalah contoh program dan saya menentukan bash sebagai penerjemah saya.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

Nah untuk menjalankan scriptnya, Anda bisa melakukannya dengan dua cara.

  • Gunakan jalur relatif untuk memanggil skrip. Pindah ke direktori tempat skrip berada dan jalankan ./Hello_world.sh.
  • Gunakan jalur absolut untuk memanggil skrip. Dari mana saja di sistem file, ketikkan path lengkap ke skrip.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Sekarang mari kita lihat apa yang terjadi ketika Anda mencoba mengirimkan program Anda tanpa shebang. Jika tidak ada shebang, program akan dikirimkan ke shell apa pun yang Anda jalankan saat ini, Dalam kasus saya, ini adalah Bash (/bin/bash).

Izinkan saya menunjukkan sebuah contoh. Saya membuat skrip python tanpa shebang dan ketika saya memanggil program tersebut, bash tidak tahu bahwa ia harus mengirimkan program ini ke juru bahasa python, melainkan ia akan menjalankan program tersebut di shell saat ini.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

Dalam hal ini, Anda dapat memanggil program dengan menyebutkan juru bahasa mana yang harus dikirimkan atau cukup tambahkan baris shebang yang selalu direkomendasikan.

which python3
$(which python3) /home/karthick/run_py.py

Sekarang setelah Anda mengetahui cara memanggil skrip, langkah selanjutnya adalah memahami apa yang terjadi saat kita memanggil skrip. Saat Anda memanggil skrip seperti yang ditunjukkan pada contoh di atas, ini akan membuat proses anak (forking) dan skrip akan dikirimkan ke proses anak. Saya menjalankan contoh skrip yang hanya akan menjalankan perintah berikut dan menunjukkan skrip dikirimkan ke proses anak.

ps -ef --forest | grep -i bash

Mungkin ada beberapa proses anak sebagai bagian dari skrip dan itu bergantung pada kode kita. Perlu dicatat bahwa variabel lingkungan yang dibuat oleh subskrip akan dihilangkan setelah selesai. Proses anak dapat mengakses variabel yang dibuat oleh proses induk dengan mengekspornya. Namun proses induk tidak dapat mengakses variabel yang dibuat oleh proses anak.

Lihat artikel di bawah ini untuk memahami lebih lanjut tentang cara kerja variabel dan cara mengekspor variabel.

  • Memahami dan Menulis 'Variabel Linux' di Shell Scripting
  • Pelajari Perbedaan Antara $$dan $BASHPID di Bash

Sumber Naskah

Sumber ” adalah perintah bawaan shell yang membaca file yang diteruskan sebagai argumen dan menjalankan kode di lingkungan shell saat ini. Kasus penggunaan yang sesuai dan paling sering Anda gunakan adalah memodifikasi konfigurasi di .bashrc atau .bash_profile dan memuat ulang perubahan menggunakan perintah sumber.

type -a source

Ada dua cara sintaksis untuk menjalankan perintah sumber. Anda dapat memilih salah satu dari dua sintaksis dan itu adalah pilihan pribadi.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Izinkan saya mendemonstrasikan cara kerja sumber sebenarnya. Saya akan membuat dua skrip shell. Skrip pertama (Module.sh) akan menampung beberapa variabel dan fungsi. Skrip kedua (Main.sh) akan mencetak variabel dan memanggil fungsinya.

File Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

File Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Tetapkan izin eksekusi untuk skrip dan panggil skrip utama “main.sh ”. Sekarang, skrip ini akan mencoba menemukan fungsi f1 dan variabel VAR1 di lingkungan shell saat ini dan akan gagal dengan perintah tidak ditemukan.

bash main.sh

Sekarang mari kita jalankan perintah source di dalam skrip yang akan memuat variabel dan fungsi ke dalam lingkungan shell saat ini dan dapat diakses melalui “main.sh ”.

File Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

File Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Sekarang jalankan skrip lagi dan lihat.

bash main.sh

Sumber sangat berguna di bash untuk mengikuti pendekatan pemrograman modular dalam membuat skrip shell kita. Kita dapat memecah kode kita menjadi modul-modul yang lebih kecil dan dapat digunakan di banyak program. Dengan cara ini, kita dapat mengikuti prinsip KERING (Jangan Ulangi Sendiri).

Itu saja untuk artikel ini. Kami telah membahas secara singkat perbedaan antara sourcing dan forking di bash. Bacalah artikel ini dan bagikan masukan Anda yang berharga kepada kami.