Saat menjalankan program C a.out
,, menggunakan terminal Ubuntu, mengapa saya selalu perlu mengetik ./
sebelumnya a.out
, bukan hanya menulis a.out
? Apakah ada solusi untuk ini?
command-line
bash
Prashant Chikhalkar
sumber
sumber
Jawaban:
Ketika Anda mengetik nama program seperti
a.out
sistem mencari file di PATH Anda. Di sistem saya, PATH diatur keMilikmu mungkin serupa. Untuk memeriksa, masukkan
echo $PATH
terminal.Sistem melihat melalui direktori ini dalam urutan yang diberikan dan jika tidak dapat menemukan program menghasilkan
command not found
kesalahan.Menjabarkan perintah dengan
./
efektif mengatakan "lupakan tentang PATH, saya ingin Anda melihat hanya di direktori saat ini".Demikian pula, Anda dapat memberi tahu sistem untuk melihat hanya di lokasi spesifik lain dengan menambahkan perintah dengan jalur relatif atau absolut seperti:
../
artinya di direktori induk mis.../hello
cari hello di direktori induk../Debug/hello
: "carihello
di subdirektori Debug dari direktori saya saat ini."atau
/bin/ls
: "carils
di direktori/bin
"Secara default, direktori saat ini tidak di jalur karena itu dianggap sebagai risiko keamanan. Lihat Mengapa. tidak di jalur secara default? pada Superuser untuk alasannya.
Dimungkinkan untuk menambahkan direktori saat ini ke PATH Anda, tetapi untuk alasan yang diberikan dalam pertanyaan yang ditautkan, saya tidak akan merekomendasikannya.
sumber
.
AndaPATH
(seperti yang disarankan 2 jawaban lainnya) karena risiko keamanan yang disebutkan dalam jawaban ini..
sini, Anda dapat menggunakan path lengkap atau relatif ke executable misalnya/home/user/foo/a.out
atau./build/a.out
.
ini spesial karena ini berarti "direktori saya saat ini", jadi bisa berupa direktori apa pun yang ditemukan oleh pengguna dengan membaca dan mengeksekusi hak istimewa. Ini berpotensi lebih berbahaya daripada menambahkan jalur khusus yang sepenuhnya memenuhi syarat..
tidak memiliki status khusus, itu hanya jalan yang bisa dimulai dengan/
dan./blah
akan bekerja sama baiknya dengancat
ataugrep
sebagai bash prompt.Alasannya sederhana.
Misalkan Anda memiliki perintah dengan nama yang sama dengan aplikasi di direktori saat ini. Kemudian menjalankan perintah di shell akan memanggil aplikasi Anda alih -alih perintah bawaan. Ini akan menjadi masalah keamanan jika tidak ada yang lain.
Dengan mengharuskan
./
untuk digunakan di depan, shell tahu bahwa Anda ingin menjalankan aplikasi dengan nama yang diberikan dan bukan perintah bawaan dengan nama itu.sumber
./
mengeksekusi file yang tidak ada di Anda$PATH
, melainkan mengeksekusi file dalam direktori saat ini (atau yang lain melalui./home/stefano/script.sh
). Sekarang, PATH adalah variabel lingkungan yang berisi semua tempat di mana bash dapat mencari program yang dapat dieksekusi, tanpa memiliki path (absolut) penuh untuknya.Pemisahan ini diperlukan untuk menghindari menjalankan file yang salah. Yaitu jika Anda memiliki file yang dipanggil
ls
di direktori home Anda, itu tidak berada di PATH Anda akan mencegah bash dari membingungkannya dengan yang aslils
. Variabel PATH juga mendefinisikan urutan pencarian:exec
syscall (metode khusus Kernel, bagaimana program dimulai), sistem mencari file dengan menelusuri setiap direktori di PATH Anda. Setelah program ditemukan, meskipun ada di banyak direktori, pencarian terputus dan yang pertama ditemukan dijalankan.Untuk menjalankan file, Anda perlu mengatur bit yang dapat dieksekusi dalam izin:
Karena Anda sudah berada di baris perintah, Anda cukup mengetik
chmod +x finename
.Atau Anda dapat mengatur izin dengan mengklik kanan file dan memilih Properties :
Anda sekarang dapat menyalin file ke salah satu direktori di PATH, untuk melihat mana yang ada di sana - dan mereka ditetapkan berdasarkan per pengguna - jenis
echo $PATH
.Jika Anda membuat file yang dapat dieksekusi
cat
,, dan memindahkannya ke/usr/local/sbin
, itu dijalankan bukannya yang tepatcat
, yang berada di/bin
. Anda dapat mengetahui di mana file Anda dengan menggunakantype cat
danwhereis cat
.sumber
gcc
, yang secara otomatis mengatur bit eksekusi.Mengapa Anda perlu mengetik
./
sebelum menjalankan program?Di terminal, setiap kali Anda mengetik nama aplikasi, katakanlah
gedit
, terminal akan mencari di beberapa direktori (yang ditentukan sebelumnya) yang berisi aplikasi (binari aplikasi). Nama-nama direktori ini terkandung dalam variabel yang disebutPATH
. Anda dapat melihat apa yang ada di variabel ini dengan mengeksekusiecho $PATH
. Lihat direktori yang dipisahkan oleh:
? Mereka adalah direktori yang terminal akan dicari, jika Anda hanya mengetikgedit
,nautilus
ataua.out
. Seperti yang Anda lihat, jalura.out
program Anda tidak ada. Ketika Anda melakukannya./a.out
, Anda memberi tahu terminal "lihat di direktori saat ini, dan jalankana.out
, dan jangan masukPATH
.Solusi 1
Jika Anda tidak ingin mengetik
./
setiap waktu, Anda harus menambahkana.out
direktori$PATH
. Dalam instruksi berikut, saya akan menganggap bahwa jalan menujua.out
adalah/path/to/programs/
, tetapi Anda harus mengubahnya ke jalan Anda yang sebenarnya.Cukup tambahkan baris berikut ke akhir file
~/.pam_environment
:Sumber: Variabel lingkungan persisten
Logout dan log in kembali. Sekarang Anda dapat berjalan
a.out
tanpa./
dari direktori mana pun.Jika Anda memiliki program lain di direktori lain, Anda bisa menambahkannya ke baris di atas. Namun, saya menyarankan untuk memiliki satu direktori bernama "myPrograms" misalnya, dan letakkan semua program Anda di bawahnya.
Solusi 2
Bagaimana jika Anda memiliki program lain yang ingin Anda jalankan? Dan mereka semua ada di folder yang berbeda? Nah, solusi "lebih terorganisir" adalah membuat folder yang disebut di
bin
bawah direktori Beranda Anda, dan menambahkan tautan simbolis (pintasan) di bawah folder itu. Begini caranya:mkdir /home/userName/bin
bin
bawah direktori Beranda Anda.ln -s /path/to/programs/a.out /home/userName/bin
a.out
program Anda di bawahbin
.Logout dan log in kembali. Sekarang Anda dapat berjalan
a.out
tanpa./
dari direktori mana pun.Sekarang, setiap kali Anda memiliki program lain di tempat lain, katakanlah program
b.in
di Desktop Anda, yang perlu Anda lakukan adalah:,ln -s /home/userName/Desktop/b.in /home/userName/bin
dan Anda kemudian dapat menjalankannya tanpa./
.sumber
Seperti George tunjukkan dalam jawabannya, ini membantu Anda mencatat bahwa Anda mengeksekusi file di direktori kerja saat ini (
pwd
).Saya ingat menanyakan pertanyaan ini kepada senior saya sejak lama, dia berkata saya harus menambahkan
.
ke jalur saya sehingga ketika sayaa.out
melihatnya di direktori saat ini dan mengeksekusi itu. Dalam hal ini saya tidak perlu melakukan./a.out
.Tetapi, secara pribadi, saya akan merekomendasikan untuk tidak melakukannya. Itu tidak pernah terjadi pada saya, tetapi jika Anda berada di direktori jaringan alien atau sesuatu, dan file eksekusi berbahaya yang disebut
ls
ada di sana, maka memiliki.
di jalur Anda adalah ide yang sangat buruk. Bukan berarti Anda akan mengalami masalah ini sangat sering, hanya mengatakan.sumber
.
untuk$PATH
. Ide yang sangat berbahaya.Selain jawaban lain, di sini bagian penting dari
man bash
yang menjelaskan dengan baik:sumber
A './' masuk akal ketika Anda menjalankan program yang dikenal untuk Anda dan spesifik, misalnya program Anda sendiri. Program ini harus ada di direktori Anda saat ini. A './' tidak masuk akal ketika Anda menjalankan perintah standar yang ada di suatu tempat di $ PATH. Perintah "yang menjalankan perintah" memberitahu Anda di mana perintah untuk dijalankan berada di $ PATH.
sumber
akan menghasilkan executable di beberapa lokasi. Jika lokasi itu di jalur Anda, Anda akan dapat menjalankan file. Anda dapat membuat skrip ini jika Anda ingin membuat label untuk tindakan "kompilasi kode sumber ini menggunakan gcc dan letakkan sebuah executable di beberapa lokasi yang ada di jalur Anda"
Saya sarankan Anda membuat direktori baru yang disebut "testbin" atau semacam itu dan letakkan di path Anda untuk menjaga direktori path yang ada bersih.
sumber
./
menghilangkan pencarian jalur yang tidak perlu../
memaksa untuk mencari di direktori saat ini saja. Jika kita tidak memberikan./
maka akan mencari berbagai jalan mengatur ke dalam sistem seperti/usr/bin
,/usr/sbin/
, dllsumber
"./" berarti Anda ingin mengeksekusi file di direktori saat ini dengan cara pintas untuk mengetik seluruh path misalnya:
sama dengan:
dalam contoh sebelumnya Anda pergi melalui direktori dan direktori-supirnya ke lokasi file dan menggunakan "./" untuk menjalankan file di direktori saat ini.
yang sebelumnya " [root @ server ~] # / path / ke / file / file.pl " juga akan mengeksekusi file jika Anda malas untuk "cd" jalan ke lokasi file.
sumber
Ini sangat sederhana dan memiliki banyak kegunaan.
/usr/bin
. Sebagai contoh, Python 2.7, Python 2.6 diinstal tetapi / usr / bin / python -> python2.7 / usr / local / bin / python -> python2.6Jika Anda berada di jalur
/usr/local/bin
dan mengeksekusi Python akan selalu mengeksekusi Python 2.7. Menentukan.
akan membuat folder saat ini dapat dieksekusi..
- selalu mewakili eksekusi dari direktori saat ini. Dan..
selalu berarti dijalankan dari direktori sebelumnya.sumber