GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Anda perlu meletakkan #!/bin/bash di awal file skrip?

Ini adalah konvensi sehingga shell *nix mengetahui jenis juru bahasa apa yang harus dijalankan.

Misalnya, ragam ATT yang lebih lama ditetapkan secara default ke sh (Bourne shell), sedangkan BSD versi lama menggunakan csh (cangkang C).

Bahkan hari ini (di mana sebagian besar sistem menjalankan bash, "Bourne Again Shell" ), skrip bisa dalam bash, python, perl, ruby, PHP, dll, dll. Misalnya, Anda mungkin melihat #!/bin/perl atau #!/bin/perl5 .

PS:Tanda seru (! ) disebut "bang" . Simbol komentar shell (# ) terkadang disebut "hash" .

PPS:Ingat - di bawah *nix, mengaitkan akhiran dengan jenis file hanyalah sebuah konvensi , bukan "aturan" . Sebuah dapat dieksekusi bisa berupa program biner, salah satu dari sejuta jenis skrip dan hal lainnya juga. Karenanya kebutuhan akan #!/bin/bash .


Lebih tepatnya shebang #! , jika itu adalah dua byte pertama dari yang dapat dieksekusi (x mode) file, diinterpretasikan oleh execve(2) system call (yang menjalankan program). Tapi spesifikasi POSIX untuk execve jangan sebut shebang.

Itu harus diikuti oleh jalur file dari penerjemah yang dapat dieksekusi (yang BTW bahkan bisa relatif, tetapi paling sering absolut).

Trik yang bagus (atau mungkin tidak terlalu bagus) untuk menemukan juru bahasa (mis. python ) di $PATH pengguna adalah dengan menggunakan env program (selalu di /usr/bin/env di semua Linux) seperti mis.

 #!/usr/bin/env python

Setiap ELF yang dapat dieksekusi dapat menjadi juru bahasa. Anda bahkan dapat menggunakan #!/bin/cat atau #!/bin/true jika Anda mau! (tapi itu seringkali tidak berguna)


Ini disebut shebang. Dalam bahasa unix, # disebut tajam (seperti dalam musik) atau hash (seperti tagar di twitter), dan ! disebut bang. (Anda sebenarnya dapat mereferensikan perintah shell sebelumnya dengan !!, disebut bang-bang). Jadi jika disatukan, Anda mendapatkan haSH-BANG, atau shebang.

Bagian setelah #! memberi tahu Unix program apa yang digunakan untuk menjalankannya. Jika tidak ditentukan, ia akan mencoba dengan bash (atau sh, atau zsh, atau apa pun variabel $SHELL Anda) tetapi jika ada di sana ia akan menggunakan program itu. Selain itu, # adalah komentar dalam sebagian besar bahasa, sehingga baris tersebut diabaikan dalam eksekusi berikutnya.


Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Mengapa Variabel Terlihat Dalam Subkulit?

  3. Apa Perbedaan Antara /sbin/nologin Dan /bin/false?

  1. Bagaimana saya tahu nama file skrip dalam skrip Bash?

  2. Cara memasukkan file dalam skrip bash shell

  3. Apa perbedaan antara #!/usr/bin/env bash dan #!/usr/bin/bash?

  1. cmake --version menunjuk ke /usr/bin/cmake sementara cmake menunjuk ke /usr/local/bin

  2. Mengapa pengguna 'bin' memerlukan shell login?

  3. #!/bin/sh vs #!/bin/bash untuk portabilitas maksimum