Mengapa beberapa sistem akan menjalankan .sh
file hanya dengan menentukan nama file tanpa ekstensi dan yang lain memerlukan ekstensi nama plus? Dalam kasus saya, saya mencoba menulis serangkaian perintah mengikuti instruksi ini .
Saya menetapkan ekstensi sekarang tetapi bisa menjalankan perintah tanpa .sh
akan lebih disukai.
command-line
scripts
Philip Kirkbride
sumber
sumber
.sh
sebagai ekstensi dalam banyak keadaan dianggap praktik buruk: Ini bertentangan dengan bagaimana perintah lain dinamai (Anda tidak menjalankanls.elf
), itu sering menyesatkan (jika Andafoo.sh
mulai dengan#!/bin/bash
, maka menjalankansh foo.sh
akan menjalankannya dengan juru bahasa yang berbeda dari yang dibangun untuk ), dan jika Anda menulis ulangfoo.sh
menjadi program Python, menggunakan ekstensi itu berarti Anda harus memilih antara menyimpan nama yang sekarang menyesatkan dan menulis ulang setiap program yang menyebutnya.+x
set - di manafoo.sh
pustaka yang dapat bersumber ke setiap shell POSIX,foo.bash
dapat bersumber ke bash,foo.ksh
ke ksh, dll.Jawaban:
Anda bingung. The
.sh
ekstensi hanya petunjuk untuk manusia, dan sama sekali tidak berpengaruh pada bagaimana sistem menangani file. Unix / Linux tidak membuatSecrets.pdf.exe
kesalahan Windows .Inilah yang terjadi ketika Anda mengetik
foo
:Pengalihan untuk
STDIN
,STDOUT
danSTDERR
diatur.Shell memeriksa tabel hash internal untuk melihat apakah ia sudah mengetahui
$PATH
entrifoo
. Jika tidak ada, shell mencari direktori di$PATH
, mencari file bernamafoo
yang memiliki bit Execute diatur dalam izin file itu.foo
Kemenangan pertama .Jika dua byte pertama dari file
foo
yang#!
, string berikutnya adalah nama seorang penerjemah untuk menjalankan. Dengan demikian#!/bin/bash
memperkenalkan skrip Bash,#!/usr/bin/perl
memperkenalkan skrip Perl, dll.Jika file dimulai dengan
\177ELF
, itu adalah biner yang dapat dieksekusi, danld.so
memulainya.Baca
man execve
danman ld.so
untuk penjelasan yang lebih rinci.sumber
chmod +x
) cukup banyak menyelesaikan ini, kan?x
bit pada semuanya) dan dari mana file itu berasal (proses apa pun dengan kontrol direktori bisa diakali untuk menetapkan izin) . Jadi, ini meredakannya , tapi saya tidak akan mengatakan itu menyelesaikannya .Secrets.pdf.exe
karena saya selalu menonaktifkanhide file extension
fitur bodohPoin utamanya adalah: Ekstensi tidak relevan dalam sistem sistem mirip Unix apa pun. Nama file hanya nama dan tidak berpengaruh pada apakah skrip atau kompilasi yang dapat dieksekusi dapat dijalankan . Seorang programmer dapat menambahkan
.sh
ekstensi untuk menunjuk bahwa suatu file adalah skrip shell, atau.py
untuk skrip python, tetapi tidak seperti Windows, unix mana pun tidak peduli dengan penamaan, ia peduli dengan izin.Yang penting adalah izin yang dapat dieksekusi diberikan ke file. Yang bisa Anda tanyakan
Menjalankan executable
Untuk menjalankan skrip umumnya ada beberapa cara.
./my_script_name
. Direktori.
berarti saat ini./home/user/bin/my_script_name
(Dua metode di atas bergantung pada memiliki izin yang dapat dieksekusi ditetapkan; apakah file merupakan bagian dari
$PATH
variabel atau tidak tidak relevan. Kehadiran#!
baris juga penting; tanpanya, skrip akan dieksekusi oleh shell saat ini yang telah Anda buka. Jika saya memilikicsh
skrip tanpa garis itu, dan coba jalankan dengan bash./my_script.csh
, itu akan gagal)$PATH
variabel Anda, Anda dapat menjalankannya hanya dengan memanggil nama. Anda dapat memanggilchmod
perintah di baris perintah hanya dengan mengetik namanya karena ada di/bin
folder./bin
selalu menjadi bagian dari$PATH
variabel. Dalam hal ini izin yang dapat dieksekusi dan lokasi masalah skrip. filename.sh
atausource filename.sh
akan membuat script diperlakukan seolah-olah itu adalah input keyboard, yaitu seolah-olah itu diketik ke baris perintah langsung. Dalam hal ini, izin dan lokasi yang dapat dieksekusi tidak masalahContohnya
Contoh # 1, berjalan dengan interpreter, untuk mengeksekusi izin
Contoh # 2, berjalan dengan
./
set izin yang dapat dieksekusi, set baris shebang.Contoh # 3, berjalan tanpa set garis shebang (gagal, karena bash tidak dapat membaca skrip python; tidak ada garis shebang mengasumsikan shell saat ini sebagai interpreter)
Contoh # 4, menjalankan skrip yang memiliki izin yang dapat dieksekusi mengatur folder formulir yang merupakan bagian dari
$PATH
variabelContoh # 5, menghapus ekstensi, masih berjalan karena ekstensi tidak penting, tetapi memiliki izin dan merupakan bagian dari
$PATH
:sumber
PATH
?man chmod
untuk melihat cara mengatur izinPenjelasan yang bagus sudah ada di sini. Saya hanya ingin menambahkan bahwa idealnya Anda tidak harus menggunakan ekstensi file untuk executable.
Biasanya Anda perlu mencapai sesuatu yang relatif mudah dan Anda mulai dengan skrip shell kecil. Seiring waktu Anda mulai menambahkan lebih banyak fungsionalitas ke skrip Anda, sampai tiba saatnya menjadi tidak dapat dipelihara atau Anda memerlukan beberapa fungsionalitas yang tidak dapat Anda capai dengan mudah dengan skrip shell dan berpikir tentang menulis ulang skrip shell ini dalam bahasa lain (python , perl, ...?).
Menulis ulang dari awal biasanya dianggap sebagai kesalahan, tetapi untuk skrip mungkin masuk akal karena biasanya skrip itu tidak terlalu besar atau memiliki banyak fungsi. Tetapi mari kita asumsikan bahwa layak untuk menulis ulang dari awal dalam beberapa bahasa lain, mempertahankan fungsi dan params / flag dari skrip shell awal.
Pengguna skrip ini tidak perlu menyadari perubahan bahasa ini, mereka akan terus menjalankan perintah yang sama dan akan terus bekerja.
Jika skrip Anda dinamai
do-something.sh
, skrip ini dapat terus berlanjutdo-something.sh
, tetapi sekarang skrip tersebut ditulis dengan python (misalnya), dan karenanya petunjuk awal Anda sekarang benar-benar menyesatkan.sumber
Untuk menjalankan file tanpa ekstensi yang biasanya Anda tidak perlu lakukan banyak, pastikan Anda memiliki (dalam kasus skrip bash) baris shebang yang tepat di baris pertama:
maka Anda juga perlu membuat file yang dapat dieksekusi oleh sistem
Ini sama dengan menggunakan
chmod +x yourfilename
angka-angka yang mudah dijelaskan.Ini adalah tiga kali lipat dari jumlah oktal yang ditambahkan, angka pertama adalah singkatan dari pengguna, yang kedua untuk grup, dan yang ketiga untuk yang lain, lebih banyak tentang yang dapat Anda temukan di sini .
Dan jika Anda berada di direktori yang sama dengan skrip Anda jangan lupa gunakan
./
seperti ini:sumber
Sufiks .sh sebenarnya bisa menghalangi, karena untuk menjalankannya Anda harus mengetikkan myscript.sh daripada hanya myscript yang tidak akan berfungsi. Lebih baik menyebutnya "myscript" tanpa akhiran .sh, dan cepat menggunakan perintah "file" akan memberi tahu Anda apakah itu biner yang dapat dieksekusi (format ELF di linux) atau skrip shell, atau skrip jenis apa pun.
QDOS (Sistem Operasi Cepat dan Kotor, yang kemudian diubah namanya menjadi "DOS" oleh IBM setelah mirosoft membajaknya dan menjualnya secara ilegal kepada mereka) dan penipuan murah lainnya dari CP / M, termasuk windows, campur semua ini karena pada sistem itu tidak ada hal seperti mengeksekusi izin pada file. Ini telah menghasilkan banyak masalah keamanan dalam 30-40 tahun terakhir. Sebenarnya hanya beberapa menit yang lalu saya baru saja mendapat beberapa junk mail dengan file zip terperangkap booby diubah namanya menjadi MYPICTURE.JPG.zip :)
sumber