Saat menjalankan skrip di bash, saya harus menulis ./
di awal:
$ ./manage.py syncdb
Jika tidak, saya mendapat pesan kesalahan:
$ manage.py syncdb
-bash: manage.py: command not found
Apa alasannya? Saya pikir .
ini adalah alias untuk folder saat ini, dan oleh karena itu kedua panggilan ini harus sama.
Saya juga tidak mengerti mengapa saya tidak perlu ./
ketika menjalankan aplikasi, seperti:
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(yang berjalan tanpa ./
)
bash
shell
unix
command-line
Dan Abramov
sumber
sumber
Jawaban:
Karena pada Unix, biasanya, direktori saat ini tidak dalam
$PATH
.Saat Anda mengetik perintah, shell mencari daftar direktori, seperti ditentukan oleh
PATH
variabel. Direktori saat ini tidak ada dalam daftar itu.Alasan tidak memiliki direktori saat ini pada daftar itu adalah keamanan.
Katakanlah Anda root dan masuk ke direktori pengguna lain dan ketik
sl
bukanls
. Jika direktori saat ini diPATH
, shell akan mencoba untuk menjalankansl
program di direktori itu (karena tidak adasl
program lain ). Itusl
Program mungkin berbahaya.Ini bekerja dengan
./
karena POSIX menentukan bahwa nama perintah yang berisi/
akan digunakan sebagai nama file secara langsung, menekan pencarian di$PATH
. Anda bisa menggunakan path lengkap untuk efek yang sama persis, tetapi./
lebih pendek dan lebih mudah untuk ditulis.EDIT
Itu
sl
bagian itu hanya contoh. Direktori diPATH
dicari secara berurutan dan ketika pertandingan dibuat bahwa program dieksekusi. Jadi, tergantung padaPATH
tampilannya, mengetik perintah normal mungkin atau mungkin tidak cukup untuk menjalankan program di direktori saat ini.sumber
ls
file yang dapat dieksekusi di dalamnya..\my.bat
dll untuk mengeksekusisl
perintah yang disebut lokomotif uap meskipun tidak tersedia secara default ;-)Ketika bash menginterpretasikan baris perintah, ia mencari perintah di lokasi yang dijelaskan dalam variabel lingkungan
$PATH
. Untuk melihatnya ketik:Anda akan memiliki beberapa jalur yang dipisahkan oleh titik dua. Seperti yang Anda lihat, path saat
.
ini biasanya tidak dalam$PATH
. Jadi Bash tidak dapat menemukan perintah Anda jika ada di direktori saat ini. Anda dapat mengubahnya dengan memiliki:Baris ini menambahkan direktori saat ini
$PATH
sehingga Anda dapat melakukan:Hal ini tidak dianjurkan karena memiliki masalah keamanan, ditambah Anda dapat memiliki perilaku aneh, seperti
.
bervariasi pada direktori Anda berada di :)Menghindari:
Karena Anda dapat "menutupi" beberapa perintah standar dan membuka pintu untuk pelanggaran keamanan :)
Hanya dua sen saya.
sumber
Script Anda, ketika di direktori home Anda tidak akan ditemukan ketika shell melihat
$PATH
variabel lingkungan untuk menemukan script Anda.The
./
mengatakan 'lihat di direktori saat ini untuk naskah saya daripada melihat semua direktori yang ditentukan dalam$PATH
'.sumber
Ketika Anda memasukkan '.' Anda pada dasarnya memberikan "path lengkap" ke skrip bash yang dapat dieksekusi, jadi shell Anda tidak perlu memeriksa variabel PATH Anda. Tanpa '.' shell Anda akan melihat dalam variabel PATH Anda (yang dapat Anda lihat dengan menjalankan
echo $PATH
untuk melihat apakah perintah yang Anda ketikkan tinggal di salah satu folder di PATH Anda. Jika tidak (seperti halnya dengan manage.py) ia mengatakannya tidak dapat menemukan file. Ini dianggap praktik buruk untuk memasukkan direktori saat ini di PATH Anda, yang dijelaskan dengan cukup baik di sini: http://www.faqs.org/faqs/unix-faq/faq/part2/section- 13.htmlsumber
Pada * nix, tidak seperti Windows, direktori saat ini biasanya tidak dalam
$PATH
variabel Anda . Jadi direktori saat ini tidak dicari ketika menjalankan perintah. Anda tidak perlu./
menjalankan aplikasi karena aplikasi ini ada dalam $ PATH Anda; kemungkinan besar mereka berada di/bin
atau/usr/bin
.sumber
Pertanyaan ini sudah memiliki beberapa jawaban yang luar biasa, tetapi saya ingin menambahkan itu, jika executable Anda ada di PATH, dan Anda mendapatkan output yang sangat berbeda ketika Anda menjalankan
ke yang Anda dapatkan jika Anda berlari
(misalkan Anda mengalami pesan kesalahan dengan yang satu dan bukan yang lain), maka masalahnya bisa jadi Anda memiliki dua versi yang dapat dieksekusi pada mesin Anda: satu di jalan, dan yang lainnya tidak.
Periksa ini dengan menjalankan
yang dapat dieksekusi
dan
Itu memperbaiki masalah saya ... Saya punya tiga versi yang dapat dieksekusi, hanya satu yang dikompilasi dengan benar untuk lingkungan.
sumber
Dasar pemikiran untuk aturan
/
POSIX PATHAturan disebutkan di: Mengapa Anda perlu ./ (dot-slash) sebelum dieksekusi atau nama skrip untuk menjalankannya dalam bash? tapi saya ingin menjelaskan mengapa saya pikir itu adalah desain yang bagus dengan lebih detail.
Pertama, versi lengkap aturan secara eksplisit adalah:
/
(mis./someprog
./bin/someprog
,./bin/someprog
): CWD digunakan dan PATH tidak/
(misalnyasomeprog
): PATH digunakan dan CWD tidakSekarang, misalkan menjalankan itu:
akan mencari:
Kemudian, jika Anda ingin lari
/bin/someprog
dari distro Anda, dan Anda melakukannya:kadang-kadang akan berfungsi, tetapi yang lain akan gagal, karena Anda mungkin berada di direktori yang berisi
someprog
program lain yang tidak terkaitOleh karena itu, Anda akan segera mengetahui bahwa ini tidak dapat diandalkan, dan Anda akan selalu selalu menggunakan jalur absolut ketika Anda ingin menggunakan PATH, karena itu mengalahkan tujuan PATH.
Ini juga mengapa memiliki jalur relatif di PATH Anda adalah ide yang sangat buruk. Saya melihat Anda,
node_modules/bin
.Sebaliknya, misalkan menjalankan:
Akan mencari:
Kemudian, jika Anda baru saja mengunduh skrip
someprog
dari repositori git dan ingin menjalankannya dari CWD, Anda tidak akan pernah yakin bahwa ini adalah program aktual yang akan dijalankan, karena mungkin distro Anda memiliki:yang ada di Anda PATH dari beberapa paket yang Anda instal setelah minum terlalu banyak setelah Natal tahun lalu.
Karena itu, sekali lagi, Anda akan dipaksa untuk selalu menjalankan skrip lokal relatif terhadap CWD dengan path lengkap untuk mengetahui apa yang Anda jalankan:
yang akan sangat mengganggu juga.
Aturan lain yang mungkin membuat Anda tergoda untuk melakukannya adalah:
tetapi sekali lagi ini memaksa pengguna untuk selalu menggunakan jalur absolut untuk skrip non-PATH
"$(pwd)/someprog"
.The
/
aturan penelusuran jalur menawarkan sederhana untuk mengingat solusi untuk tentang masalah:PATH
PATH
yang membuatnya sangat mudah untuk selalu tahu apa yang Anda jalankan, dengan mengandalkan fakta bahwa file dalam direktori saat ini dapat dinyatakan sebagai
./somefile
atausomefile
, dan karenanya memberikan makna khusus kepada salah satu dari mereka.Kadang-kadang, sedikit menjengkelkan bahwa Anda tidak dapat mencari
some/prog
relatif terhadapPATH
, tetapi saya tidak melihat solusi yang lebih waras untuk ini.sumber
Ketika skrip tidak ada di Path, wajib untuk melakukannya. Untuk info lebih lanjut baca http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html
sumber
Semua memiliki jawaban yang bagus pada pertanyaan, dan ya ini hanya berlaku ketika menjalankannya di direktori saat ini, kecuali jika Anda menyertakan jalur absolut. Lihat contoh saya di bawah ini.
Juga, (dot-slash) masuk akal bagi saya ketika saya sudah perintah pada folder anak tmp2 (/ tmp / tmp2) dan menggunakan (double dot-slash).
SAMPEL:
sumber