Saya telah membuat skrip Bash sebelumnya dan semuanya berjalan baik tanpa #!/bin/bash
di awal.
Apa gunanya memasukkannya? Apakah ada yang berbeda?
Juga, bagaimana Anda mengucapkannya #
? Saya tahu itu !
diucapkan sebagai "bang."
Bagaimana cara #!
diucapkan?
./yourscript.extension
, misalnya,./helloworld.py
atau./helloworld.sh
, itu akan mencari penerjemah di baris atas itu, yang akan menjadi#!/bin/python
atau!#/bin/bash
, sedangkan ketika menjalankan script sepertipython helloworld.py
, baris pertama tidak akan diamati karena dikomentari di luar. Jadi ini adalah urutan khusus untuk shell / kernel.Jawaban:
Ini adalah konvensi sehingga shell * nix tahu jenis interpreter apa yang harus dijalankan.
Misalnya, rasa ATT yang lebih lama default ke sh (the Bourne shell), sementara versi BSD yang lebih lama default ke csh (shell C).
Bahkan hari ini (di mana sebagian besar sistem menjalankan bash, "Bourne Again Shell" ), skrip dapat menggunakan bash, python, perl, ruby, PHP, dll, dll. Misalnya, Anda mungkin melihat
#!/bin/perl
atau#!/bin/perl5
.PS: Tanda seru (
!
) disebut "bang" . Simbol komentar shell (#
) kadang-kadang disebut "hash" .PPS: Ingat - di bawah * nix, mengaitkan sufiks dengan tipe file hanyalah konvensi , bukan "aturan" . Sebuah executable dapat berupa program biner, salah satu dari sejuta jenis skrip dan hal lainnya juga. Maka kebutuhan untuk
#!/bin/bash
.sumber
execve(2)
syscall; jadi shebang adalah konvensi kernel , bukan shell.#!/bin/sh
hal-hal seperti.profile
dan hal-hal yang berjalan onloadUntuk lebih tepatnya shebang
#!
, ketika itu adalah dua byte pertama dari file (x
mode ) yang dapat dieksekusi , ditafsirkan oleh panggilan sistem execve (2) (yang menjalankan program). Tetapi spesifikasi POSIX untukexecve
tidak menyebutkan shebang.Itu harus diikuti oleh path file dari interpreter executable (yang BTW bahkan bisa relatif, tetapi paling sering absolut).
Trik yang bagus (atau mungkin tidak terlalu bagus ) untuk menemukan penerjemah (mis.
python
) Pada pengguna$PATH
adalah dengan menggunakanenv
program (selalu ada di/usr/bin/env
semua Linux) seperti mis.Setiap eksekusi ELF dapat menjadi juru bahasa. Anda bahkan dapat menggunakan
#!/bin/cat
atau#!/bin/true
jika Anda mau! (tapi itu akan sering tidak berguna)sumber
#!/usr/bin/env
peretasan.#!/usr/bin/env bash -x
. Bagaimana aku melakukan itu ?#!/usr/bin/env bash -x
bash
hampir selalu/bin/bash
jadi shebang Anda seharusnya#!/bin/bash -x
Ini disebut shebang . Dalam unix-speak, # disebut sharp (seperti dalam musik) atau hash (seperti hashtag di twitter), dan! disebut bang. (Anda benar-benar dapat merujuk perintah shell sebelumnya dengan !!, disebut bang-bang). Jadi ketika disatukan, Anda mendapatkan haSH-BANG, atau shebang.
Bagian setelah #! memberitahu 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, ia akan menggunakan program itu. Plus, # adalah komentar dalam sebagian besar bahasa, sehingga baris tersebut diabaikan dalam eksekusi berikutnya.
sumber
execve(2)
syscall tidak menggunakan$SHELL
variabel. Adalah kernel yang mengartikan shebang.The shebang adalah direktif untuk loader untuk menggunakan program yang ditetapkan setelah
#!
sebagai juru bahasa untuk file tersebut ketika Anda mencoba untuk melaksanakannya. Jadi, jika Anda mencoba menjalankan file bernamafoo.sh
yang ada#!/bin/bash
di bagian atas, perintah sebenarnya yang dijalankan adalah/bin/bash foo.sh
. Ini adalah cara yang fleksibel dalam menggunakan penerjemah yang berbeda untuk program yang berbeda. Ini adalah sesuatu yang diimplementasikan pada tingkat sistem dan API tingkat pengguna adalah konvensi shebang.Perlu juga diketahui bahwa shebang adalah angka ajaib - yang dapat dibaca manusia yang mengidentifikasi file sebagai skrip untuk penerjemah yang diberikan.
Maksud Anda tentang hal itu "bekerja" bahkan tanpa shebang hanya karena program tersebut adalah skrip shell yang ditulis untuk shell yang sama dengan yang Anda gunakan. Misalnya, Anda dapat menulis file javascript dengan sangat baik dan kemudian meletakkan
#! /usr/bin/js
(atau yang serupa) untuk memiliki "skrip Shell" javascript.sumber
Sistem operasi menggunakan shell default untuk menjalankan skrip shell Anda. jadi dengan menyebutkan path shell di awal skrip, Anda meminta OS untuk menggunakan shell tersebut. Ini juga berguna untuk portabilitas .
sumber
Setiap distribusi memiliki shell default. Bash adalah default pada sebagian besar sistem. Jika Anda bekerja pada sistem yang memiliki shell default berbeda, maka skrip mungkin tidak berfungsi sebagaimana dimaksud jika ditulis khusus untuk Bash.
Bash telah berevolusi selama bertahun-tahun mengambil kode dari
ksh
dansh
.Menambahkan
#!/bin/bash
sebagai baris pertama skrip Anda, memberitahu OS untuk memanggil yang ditentukanshell
untuk menjalankan perintah yang mengikuti skrip.#!
sering disebut sebagai "hash-bang", "she-bang" atau "sha-bang".sumber
Ini disebut shebang . Ini terdiri dari tanda angka dan karakter tanda seru (#!), Diikuti oleh path lengkap ke penerjemah seperti / bin / bash. Semua skrip di bawah UNIX dan Linux mengeksekusi menggunakan interpreter yang ditentukan pada baris pertama.
sumber
Anda juga akan melihat beberapa parameter lain setelah #! / Bin / bash, misalnya
#!/bin/bash -v -x
baca ini untuk mendapatkan lebih banyak ide.
/unix/124272/what-do-the-arguments-v-and-x-mean-to-bash .
sumber
Ini dapat bermanfaat bagi seseorang yang menggunakan sistem berbeda yang tidak memiliki perpustakaan yang tersedia. Jika itu tidak dideklarasikan dan Anda memiliki beberapa fungsi dalam skrip Anda yang tidak didukung oleh sistem itu, Anda harus mendeklarasikan # / bin / bash. Saya pernah mengalami masalah ini sebelum di tempat kerja dan sekarang saya hanya memasukkannya sebagai latihan.
sumber