Saya telah menulis naskah sederhana. Ketika saya menjalankan sh <myscriptname.sh>
, saya mendapatkan output yang benar, tetapi ketika saya menjalankan ./<myscriptname.sh>
, saya mendapat kesalahan.
Apa perbedaan antara ketika saya melakukannya sh
dan ./
?
command-line
scripts
executable
mr_eclair
sumber
sumber
Jawaban:
Saat Anda menjalankan skrip apa pun dengan meneruskan nama file ke program juru bahasa skrip, Anda menjalankan program juru bahasa dengan skrip sebagai argumen yang diteruskan ke dalamnya. Misalnya ini akan terlihat seperti proses 'sh' dengan argumen 'filename.sh'. The
sh
interpreter membuka file.Di sisi lain, jika Anda menjalankan skrip itu sendiri, sistem memanggil program penerjemah yang ditentukan dan memasukkan isi skrip. Dalam hal ini prosesnya terlihat seperti 'filename.sh' tanpa argumen.
Anda harus memastikan Anda memiliki garis bang:
Garis bang adalah baris paling pertama dalam skrip dan dimulai dengan dua karakter yang sama
#!
, inilah yang dibaca sistem ketika mencoba menjalankan skrip dan kemudian sistem meneruskan skrip ke program segera setelahnya. Perhatikan bahwa baris ini tidak ada hubungannya dengan bash dan berfungsi dengan baik untuk python dan perl, meskipun mereka bahasa yang sangat berbeda. Anda akan menggunakan#!/usr/bin/python
misalnya dan kemudian mengikutinya dengan kode python.Setelah Anda memiliki skrip, pastikan Anda telah mengatur izin eksekusi:
Kemudian Anda dapat menjalankan skrip sebagai prosesnya sendiri:
Atau letakkan file di lokasi yang diketahui dengan nama program yang bagus, sukai
/usr/sbin
dan jalankan dari mana saja:Dan ini benar-benar manfaat praktis menggunakan garis bang dengan izin yang tepat - ini semua tentang penyebaran . Sangat sulit untuk membuat pengguna menjalankan skrip jika mereka harus mengingat program apa yang digunakan untuk menjalankan skrip. Ingatlah untuk memberikan path lengkap ke skrip setiap kali mereka ingin menjalankannya. Di mana menempatkannya sebagai
/usr/local/bin
contoh, dan membuatnya dapat dieksekusi, dapat menyimpan banyak kesedihan bagi orang-orang yang mencoba menggunakan skrip Anda. Program-program ini kemudian tersedia untuk semua pengguna di komputer Anda.Ini juga baik untuk identifikasi. Jika Anda masuk ke dalam
top
program, skrip yang dijalankan tanpa bang line hanya akan memiliki nama penerjemah yaitubash
,perl
ataupython
. Tetapi jika skrip dijalankan dengan izin yang tepat, maka nama skrip akan ditampilkan.Catatan: Jika Anda ingin mendistribusikan skrip yang dapat diakses oleh semua orang, silakan buat halaman manual dan paket deb untuk menginstalnya. Kita perlu mengurangi jumlah skrip acak daring dan meningkatkan jumlah debet yang dapat dihapus instalasinya.
sumber
bash
, bukansh
.PATH
./usr/local/bin
mungkin lebih baik/usr/sbin
- itu menunjukkan bahwa program ini lokal untuk mesin ini daripada menjadi bagian dari distribusi.Versi singkat:
sh
adalah interpreter baris perintah (tanda hubung).Menjalankan
sh my_script
membuat tanda hubung menafsirkan skrip../
mencoba mencari penerjemah mana yang akan digunakan, dengan melihat baris pertama. Misalnya#!/bin/bash
, atau bahkan#!/bin/ruby
(bukan berlariruby my_script
).sumber
./
menemukan apa-apa, itu adalah metode eksekusi sistem yang melihat dua byte pertama dari file.sh
dan file tersebut berisi sha-bang, apakah itu berarti sha-bang akan diabaikan atau akankah ia membuka shell manash
tautannya juga dan kemudian mungkin beberapa shell lain atau apa fungsinya :)?Perbedaan yang Anda lakukan adalah,
dengan
sh
, Anda menjalankan program yang akan menginterpretasikan garis-garis dalam skrip Anda seperti halnya Anda mengetiknya pada prompt interaktif terminal,dengan
./
Anda membuat jalan pintas dengan asumsi bahwa skrip tepat di sini di direktori saat ini Anda duduk DAN itu akan dapat dieksekusi (karena misalnya Anda mengeluarkanchmod +x myscript.sh
), menghemat waktu Anda yang tak ternilai untuk masa mendatang :-)sumber
sh
file tidak harus dapat dieksekusi.Ada tiga alasan utama Anda mungkin mendapatkan kesalahan:
dijalankan
chmod +x <myscriptname.sh>
untuk memperbaikinyanoexec
")menyalin skrip ke
/usr/local/bin
#!
baris memiliki kesalahanpastikan baris pertama adalah
#!/bin/sh
atau#!/bin/bash
Jika baris pertama Anda terlihat benar, tetapi masih tidak berfungsi, pastikan file tersebut tidak memiliki akhiran garis DOS.
Kesalahan akan terlihat seperti ini:
Anda dapat memperbaikinya dengan menjalankan
dos2unix <myscriptname.sh>
, atau jika Anda tidak memilikinyaperl -p -i -e 's/\r\n$/\n/' <myscriptname.sh>
,.sumber
Dan jawabannya adalah sh adalah nama untuk shell yang sangat populer. Namun ketinggalan jaman dan digantikan oleh orang lain. Saat ini sh dikaitkan dengan cangkang lain yang terpasang pada mesin. misal saya sudah bash putt di sana. Menjalankan sembarang shell dari sh biasanya memicu beberapa mode 'kompatibilitas' dengan perilaku 'shell' asli.
Jadi solusinya cukup sederhana. Lihat apa yang ada di balik perintah sh (ls -al / bin / sh), dan letakkan #! / Bin / whatever_you_find_there sebagai baris pertama (atau jika ada sesuatu seperti itu dalam skrip Anda, editlah).
Dan alternatifnya mungkin ada beberapa bug dalam skrip itu sendiri. Seperti ketergantungan yang dipenuhi oleh sh, tetapi bukan penerjemah yang benar-benar digunakan.
sumber
Tidak
/usr/sbin
, itu untuk alat administratif yang tidak penting,/usr/local/bin
adalah pilihan yang lebih baik jika Anda tidak ingin memilikinya~/bin/
, tetapi menghindarisudo
sebisa mungkin disarankan.sumber
~/.profile
sudah memiliki kode untuk menambahkan~/bin
, jika ada, untukPATH
. Pada catatan lain, jangan letakkan ekstensi pada skrip.ls ~/bin/|wc -l = 428
) Saya menaruh banyak barang di sana;)/bin
dan/usr/bin
Anda akan melihat mereka tidak menggunakan ekstensi.