Inti dari pertanyaan:
Pertanyaan muncul ketika saya tidak dapat menginstal perangkat lunak, jadi saya benar-benar bertanya tentang. / Karena saya tidak tahu tentang hal itu dan output "perintah tidak ditemukan" membingungkan saya tentang apa sebenarnya perintah itu.
Konteks:
Saya ingin menginstal file truecrypt-7.2-setup-x86
.
Instruksi mengatakan untuk menggunakan perintah:
sudo ./truecrypt-7.2-setup-x86
Tetapi hasilnya adalah:
sudo: ./truecrypt-7.2-setup-x86: command not found
UPDATE: untuk kelengkapan, dalam pengujian saya berada di folder file tetapi belum membuat file dapat dieksekusi (chmod + x).
./
dari perintah mengatakan "Lihat di direktori saat ini, dan jalankan perintah 'truecrypt-7.2-setup-x86' dari sini". Anda perlu menjalankan perintah ini dari direktori tempat Anda membuka file.chmod +x
,chmod -x
sebaliknya - menghapus izin yang dapat dieksekusiJawaban:
./
bukan perintah. Perintahnya adalah./truecrypt-7.2-setup-x86
.Shell dan program-program seperti Anda
sudo
akan memperlakukan perintah sebagai pathname ketika mengandung setidaknya satu/
karakter. Karena.
mewakili direktori apa pun Anda saat ini,./truecrypt-7.2-setup-x86
nama filetruecrypt-7.2-setup-x86
di direktori saat ini. Jika tidak ada file seperti itu, atau ada tetapi file tidak dapat dijalankan, maka Anda akan mendapatkan pesan kesalahan.Ketika sebuah perintah tidak mengandung garis miring, direktori yang terdaftar di
$PATH
mencarinya, seperti kata Sergiy Kolodyazhnyy . Direktori saat ini tidak secara otomatis mencari - dan itu tidak dianjurkan untuk menempatkan.
di$PATH
. Dengan begitu, Anda tidak secara tidak sengaja menjalankan hal-hal yang tidak Anda harapkan untuk dijalankan karena Anda kebetulan memilikicd
d ke direktori yang memuatnya.Menulis di
./
depan nama yang dapat dieksekusi di direktori saat ini adalah cara umum untuk menjalankannya, tetapi ini sebenarnya bukan sintaks khusus. Misalnya, jika Anda mengacaukan$PATH
perintah Anda dan Anda perlu menjalankan perintahls
, Anda bisa menulis/bin/ls
. Tidak.
diperlukan dalam kasus itu atau secara umum; yang dibutuhkan adalah suatu/
tempat di pathname untuk menandakan bahwa maksud Anda itu adalah pathname.Karena
.
selalu direktori saat ini dan/
hanya pemisah direktori, hal pertama yang harus dilakukan adalah memeriksa apakah file yang Anda beri nama benar-benar ada di direktori saat ini. (Jika ya, maka periksa izinnya , seperti dijelaskan Charles Green . Tetapi jika Anda mengekstrak file dari arsip, maka biasanya sudah memiliki izin yang dapat dieksekusi jika dimaksudkan untuk dijalankan.)sumber
Bagian ./ dari perintah mengatakan "Lihat di direktori saat ini, dan jalankan perintah 'truecrypt-7.2-setup-x86' dari sini". Anda perlu menjalankan perintah ini dari direktori tempat Anda membuka file.
Ini dapat diuji: Di jendela terminal yang sama di mana Anda mencoba perintah, masukkan perintah
ls -l true*
- jika file ada di direktori kerja saat ini, maka daftar yang menunjukkan file (dan banyak informasi tambahan) akan ditampilkan.Seperti yang Zanna catat dalam komentar, file Anda mungkin tidak memiliki izin untuk dieksekusi - ini dapat diperbaiki dengan mudah. Sebagai kasus uji, direktori saya menunjukkan
dan file "rFullBack" mencantumkan '-rw-' sebagai izin saya, untuk membaca dan menulis file. Saya dapat menjalankan perintah
chmod +x rFullBack
dan perubahan direktori listing keDi sana izin saya sekarang '-rwx', menunjukkan saya dapat menjalankan file.
Singkatnya, jika file tersebut ada di direktori Anda
jalankan perintah
dan kemudian perintah
sumber
rw-
sebagai izin Anda --
sebelum untuk set [gu] id dan bit lengket.Bagaimana cara memanggil perintah di shell bekerja
Tidak, ini bukan perintah. Cara kerja shell adalah ketika Anda mengetikkan satu baris teks, kata pertama akan diperlakukan sebagai perintah, dan jika perintah tersebut bukan salah satu dari shell yang ada di dalam maka shell akan melihat semua lokasi yang terdaftar dalam
PATH
variabel lingkungan .Apa yang terjadi jika ketika perintah yang ingin Anda jalankan berada di direktori yang sama dengan Anda saat ini tetapi direktori itu tidak ada dalam daftar
PATH
direktori? Saat itulah Anda perlu menggunakan./
. Ini dengan cara yang persis sama dengan melakukan/bin/bash
- Anda memberi tahu shell di mana perintah yang Anda inginkan berada, jalur penuh untuk itu. Dan dalam kasus ./ Anda mengatakan untuk shell "lihat di direktori ini". Jadi bagian yang penting adalah Anda harus berada di direktori yang sama di mana file tersebut berada.Tentu saja, untuk benar-benar menjalankan executable, ia harus memiliki bit set yang dapat dieksekusi, jadi Anda harus melakukannya
chmod +x ./my_file
.Jadi langkah-langkah penting:
cd
tempat Anda menyimpan file; jika ada di~/Downloads
, makacd ~/Downloads
chmod +x ./truecrypt-7.2-setup-x86
, ini mengatakan "buat file truecrypt-7.2-setup-x86 yang ada di direktori ini dapat dieksekusi"sudo ./truecrypt-7.2-setup-x86
Perhatikan bahwa penggunaan
./
bukan perilaku acak, tetapi sebenarnya merupakan standar, yang ditentukan oleh standar Antarmuka Sistem Pengoperasian Portabel (alias POSIX) , secara khusus lihat bagian "Perintah Pencarian dan Eksekusi".Mereproduksi kesalahan
CATATAN : pesan kesalahan yang diberikan
sudo
jelas menyesatkan sehingga ini adalah sesuatu yang harus diingat; namun harap dicatat bahwa ini bukan inti dari pertanyaan yang diajukan OP.Dokumentasi dan referensi
Dari
bash
4.3 manual, bagian "COMMAND EXECUTION":Dari Mengapa Anda perlu ./ (dot-slash) sebelum nama skrip untuk menjalankannya di bash? :
sumber
sudo
output menyesatkan. Jika Anda mencoba yang sama tanpasudo
, Anda akan mendapatkan kesalahan lain daribash
:Permission denied
. Dan memang seharusnya begitu, karena Anda belum memberikan izin skrip untuk mengeksekusi (viachmod +x
).sudo
output menyesatkan memang benar, tapi itulah kesalahan yang muncul. Itu mungkin sesuatu untuk dilaporkan kepada pengembang dan biarkan mereka memperbaikinya. Namun ini bukan inti dari diskusi - kami perlu menetapkan apa yang telah dilakukan OP untuk menghasilkan kesalahan seperti itu, dan membimbing mereka ke jalan yang benar. Apakah itu menyesatkan - itu bukan masalah di sini./bin/bash
: Ini tidak memungkinkan Anda untuk mengeksekusi skrip di mana Anda tidak memiliki izin eksekusi. Ketika Anda membuka pengantar nama skrip/bin/bash
, fakta yang/bin/bash
dapat dieksekusi adalah yang terpenting, karena itu adalah perintah yang dieksekusi. Ketika Anda tidak melakukan itu, skrip itu sendiri sedang dieksekusi, yang pada gilirannya mengarah ke shell Anda saat ini atau apa pun yang ada di#!
baris teratas yang dipanggil/bin/bash
hanyalah contoh di sini. Fakta bahwa kita sedang menelepon/bin/bash
dan./script.sh
dengan menentukan jalan menuju hal yang dieksekusi - itu sama. Prakata naskah denganbash script.sh
atau/bin/bash script.sh
yang sama sekali topik yang berbeda, di mana Anda menjalankan executable dan lulus script untuk itu sebagai argumen - yang dengan cara dapat pecah jika sintaks ditulis untuk sesuatu yang lain dari shell Anda panggil sedang, mengatakancsh
./bin/bash
dieksekusi baik-baik saja, tetapi kenyataannya adalah bahwa Anda masih menentukan path lengkap untuk itu./bin/bash
atau bahkan hanyabash
merupakan juga cara yang umum untuk mengatasi kekurangan hak akses executable pada script. Menentukan jalur skrip lengkap tidak menyelesaikan masalah itu. Jadi/bin/bash
adalah contoh yang sangat buruk dalam kasus khusus ini.