Jawaban:
Untuk menjalankan sh
skrip yang tidak dapat dieksekusi , gunakan:
sh myscript
Untuk menjalankan bash
skrip yang tidak dapat dieksekusi , gunakan:
bash myscript
Untuk memulai file yang dapat dieksekusi (file apa saja dengan izin yang dapat dieksekusi); Anda cukup menentukannya menurut jalurnya:
/foo/bar
/bin/bar
./bar
Untuk membuat skrip dapat dieksekusi, berikan izin yang diperlukan:
chmod +x bar
./bar
Ketika sebuah file dapat dieksekusi, kernel bertanggung jawab untuk mencari tahu bagaimana cara membukanya. Untuk non-binari, ini dilakukan dengan melihat baris pertama file. Itu harus mengandung hashbang
:
#! /usr/bin/env bash
Hashbang memberitahu kernel program apa yang harus dijalankan (dalam hal ini perintah /usr/bin/env
dijalankan dengan argumen bash
). Kemudian, skrip diteruskan ke program (sebagai argumen kedua) bersama dengan semua argumen yang Anda berikan skrip sebagai argumen berikutnya.
Itu berarti setiap skrip yang dapat dieksekusi harus memiliki hashbang . Jika tidak, Anda tidak memberitahu kernel apa yang , dan karena itu kernel tidak mengetahui program apa yang digunakan untuk menginterpretasi itu. Bisa jadi bash
, perl
, python
, sh
, atau sesuatu yang lain. (Pada kenyataannya, kernel akan sering menggunakan shell default pengguna untuk menginterkrip file, yang sangat berbahaya karena mungkin tidak menjadi penerjemah yang tepat sama sekali atau mungkin dapat menguraikan beberapa di antaranya tetapi dengan perbedaan perilaku yang halus seperti kasus antara sh
dan bash
).
/usr/bin/env
Paling umum, Anda akan melihat poni hash seperti:
#!/bin/bash
Hasilnya adalah bahwa kernel akan menjalankan program /bin/bash
untuk menafsirkan skrip. Sayangnya, bash
tidak selalu dikirimkan secara default, dan itu tidak selalu tersedia di /bin
. Sementara pada mesin Linux biasanya, ada berbagai mesin POSIX lain di mana bash
dikirimkan di berbagai lokasi, seperti /usr/xpg/bin/bash
atau /usr/local/bin/bash
.
Untuk menulis skrip bash portabel, oleh karena itu kita tidak dapat mengandalkan hard-coding lokasi bash
program. POSIX sudah memiliki mekanisme untuk menangani dengan itu: PATH
. Idenya adalah bahwa Anda menginstal program Anda di salah satu direktori yang ada PATH
dan sistem harus dapat menemukan program Anda ketika Anda ingin menjalankannya dengan nama.
Sayangnya, Anda tidak bisa hanya melakukan ini:
#!bash
Kernel tidak akan (sebagian mungkin) melakukan PATH
pencarian untuk Anda. Ada sebuah program yang dapat melakukan PATH
pencarian untuk Anda, itu disebut env
. Untungnya, hampir semua sistem memiliki env
program yang diinstal /usr/bin
. Jadi kami mulai env
menggunakan lintasan hardcode, yang kemudian melakukan PATH
pencarian bash
dan menjalankannya sehingga dapat menafsirkan skrip Anda:
#!/usr/bin/env bash
Pendekatan ini memiliki satu kelemahan: Menurut POSIX, hashbang dapat memiliki satu argumen . Dalam hal ini, kami menggunakan bash
sebagai argumen untuk env
program. Itu berarti kita tidak punya ruang tersisa untuk mengajukan argumen bash
. Jadi tidak ada cara untuk mengonversi sesuatu seperti #!/bin/bash -exu
ke skema ini. Anda harus memasukkan set -exu
hashbang sebagai gantinya.
Pendekatan ini juga memiliki keuntungan lain: Beberapa sistem mungkin mengirim dengan /bin/bash
, tetapi pengguna mungkin tidak menyukainya, mungkin menemukan itu buggy atau ketinggalan zaman, dan mungkin telah menginstal sendiri di bash
tempat lain. Ini sering terjadi pada OS X (Macs) di mana Apple mengirimkan barang usang /bin/bash
dan pengguna menginstal yang terbaru /usr/local/bin/bash
menggunakan sesuatu seperti Homebrew. Saat Anda menggunakan env
pendekatan yang melakukan PATH
pencarian, Anda memasukkan preferensi pengguna ke dalam akun dan menggunakan bash pilihannya di atas yang dikirimkan sistemnya.
zsh
shell saya, apakah saya akan menggunakan hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
jika (dan hanya jika) kode di dalam skrip harus dieksekusi oleh Z shell.
Untuk shell bourne:
sh myscript.sh
Untuk bash:
bash myscript.sh
Jika Anda ingin skrip dijalankan di shell saat ini (mis. Anda ingin skrip dapat memengaruhi direktori atau lingkungan Anda), Anda harus mengatakan:
. /path/to/script.sh
atau
source /path/to/script.sh
Catatan yang /path/to/script.sh
dapat bersifat relatif, misalnya . bin/script.sh
menjalankan script.sh
dalam bin
direktori di bawah direktori saat ini.
Pertama, beri izin untuk eksekusi: -
chmod +x script_name
sh script_name
bash script_name
./script_name
CATATAN : -Anda dapat memeriksa apakah file dapat dieksekusi atau tidak dengan menggunakan 'ls -a'
Sedikit tambahan, untuk menjalankan juru bahasa dari folder yang sama, masih menggunakan #! Hashbang dalam skrip.
Sebagai contoh, sebuah executable php7.2 yang disalin dari / usr / bin ada dalam folder di sepanjang skrip halo .
#!./php7.2
<?php
echo "Hello!";
Untuk menjalankannya:
./hello
Yang berperilaku sama dengan:
./php7.2 hello