./ (nokta eğik çizgi) bir komut mu?


16

Sorunun özü:

Soru yazılımı yükleyemediğimde ortaya çıktı, bu yüzden gerçekten soruyorum. / Çünkü bilmiyordum ve "komut bulunamadı" çıktısı aslında komutun ne olduğu hakkında kafa karıştırıyordu.

Bağlam:

Dosyayı kurmak istiyorum truecrypt-7.2-setup-x86.

Talimatlar komutu kullanmayı söylüyor:

sudo ./truecrypt-7.2-setup-x86

Ancak çıktı:

sudo: ./truecrypt-7.2-setup-x86: command not found

GÜNCELLEME: tamlık için, testte ben dosya klasöründeydim ama dosyayı çalıştırılabilir yapmadım (chmod + x).


1
./Komutunun parçası "geçerli dizinde bak ve buradan komut 'truecrypt-7.2-kurulum-x86' yürütmek" söylüyor. Bu komutu dosyayı açtığınız dizinden çalıştırmanız gerekir.
Charles Green

2
@Videonauth - Pek değil, kişisel olarak bunun bir cevap düzeyine yükseldiğini sanmıyorum.
Charles Green

1
@Zanna Bir komut dosyasını yürütme izinleri olmadan test ettim ve atılan hata eksik bir izin hatasıydı, bir komut bulunamadı.
Charles Green

2
@ubuntubu Tamam, çok iyi, dizine taşındınız - iyi. Yine de düzenleme hakkında küçük bir yorum. Komut olmalıdır chmod +x, chmod -xtersidir - bu yürütülebilir izinleri kaldırır
Sergiy Kolodyazhnyy

4
Soru başlığı vücuttan oldukça farklıdır; belki bu düzeltilmeli?
David Z

Yanıtlar:


24

./bir komut değildir. Komut ./truecrypt-7.2-setup-x86.

Kabuğunuz ve benzeri programlar sudo, bir komutu en az bir karakter içerdiğinde yol adı olarak görür /. Beri .sen de an hangi dizin temsil ./truecrypt-7.2-setup-x86isimleri dosya truecrypt-7.2-setup-x86geçerli dizinde. Böyle bir dosya yoksa veya dosya çalıştırılamazsa, bir hata mesajı alırsınız.

Bir komut eğik çizgi içermediğinde $PATH, Sergiy Kolodyazhnyy'nin dediği gibi, listelenen dizinler aranır . Geçerli dizin otomatik değil aranır - ve bir değil koymak için tavsiye .içinde $PATH. Bu şekilde, çalıştırmayı beklemediğiniz şeyleri yanlışlıkla çalıştırmazsınız çünkü cdbunları içeren bir dizine d uyguladınız.

./Geçerli dizinde bir yürütülebilir dosyanın adından önce yazmak genel yolu çalıştırmaktır, ancak bu aslında özel bir sözdizimi değildir. Örneğin, berbat ettiyseniz $PATHve şöyle bir komut çalıştırmanız gerekiyorsa ls, yazabilirsiniz /bin/ls. Hayır .bu durumda ya da genel olarak gereklidir; gereken, /yol adında bir yol adı demek istediğinizi belirtmek için bir yer.

Yana .her zaman geçerli dizin ve /sadece dizin ayırıcı olup, yapmanız gereken ilk şey adlandırdığınız dosya gerçekten geçerli dizinde bulunduğunu kontroldür. (Varsa , Charles Green'in açıkladığı gibi izinlerini kontrol edin . Ancak dosyayı bir arşivden çıkarttıysanız, çalıştırılması amaçlanıyorsa genellikle zaten yürütülebilir izinlere sahip olacaktır.)


21

Komutun ./ kısmı "Geçerli dizine bakın ve 'truecrypt-7.2-setup-x86' komutunu buradan yürütün" diyor. Bu komutu dosyayı açtığınız dizinden çalıştırmanız gerekir.

Bu test edilebilir: Komutu denediğiniz terminal penceresinde komutu girin ls -l true*- dosya geçerli çalışma dizininde mevcutsa, dosyayı gösteren bir liste (ve bir dizi ek bilgi) görüntülenir.

Zanna'nın yorumlarda belirttiği gibi, dosyanızın yürütme izinleri olmayabilir - bu kolayca düzeltilebilir. Bir test örneği olarak, dizinim

chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

ve "rFullBack" dosyası benim iznim olarak dosyayı okumak ve yazmak için '-rw-' yazıyor. Komutu yürütebilirim chmod +x rFullBackve dizin listesi şu şekilde değişir:

chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

Orada benim izinleri şimdi '-rwx', dosyayı çalıştırabiliyorum gösterir.


Kısacası, dosya dizininizde varsa

komutu çalıştır

chmod +x ./truecrypt-7.2-setup-x86

ve sonra komut

sudo ./truecrypt-7.2-setup-x86

1
Pek değil. rw-İzniniz olarak listelenir - -set [gu] kimliği ve yapışkan bitler için öncedir.
Duncan X Simpson

@DuncanXSimpson Teşekkürler - İzinlerin açıklamasını biraz güncelledim, ancak bu cevap için ayarlanmış ve yapışkan bitleri göz ardı edeceğim!
Charles Green

8

Kabukta çağrı komutları nasıl çalışır

Hayır, bu bir komut değil. Kabukların çalışma şekli, bir metin satırı yazdığınızda, ilk sözcük komut olarak kabul edilir ve komut kabukta yerleşik olanlardan biri değilse, kabuk PATH ortam değişkeninde listelenen tüm konumlara bakar .

Çalıştırmak istediğiniz komut şu anda bulunduğunuz dizinde bulunuyorsa, ancak bu dizin dizinler listesinde değilse ne olur PATH? O zaman kullanmanız gerekir ./. Yapmakla aynı şekilde /bin/bash- kabuğa istediğiniz komutun bulunduğu yere, ona tam bir yol söylüyorsunuz. Ve ./ durumunda "bu dizine bak" komutunu vermeyi söylüyorsunuz. Bu nedenle önemli olan kısım, dosyanın bulunduğu dizinde bulunmanızdır.

Tabii ki, bir çalıştırılabilir dosyayı gerçekten çalıştırmak için çalıştırılabilir bit ayarına sahip olmalıdır, bu yüzden yapmanız gerekir chmod +x ./my_file.

Yani önemli adımlar:

  1. cd dosyayı kaydettiğiniz yer ; eğer ~/Downloadsiçerideysecd ~/Downloads
  2. Çalıştır chmod +x ./truecrypt-7.2-setup-x86, " bu dizindeki yürütülebilir dosyayı truecrypt-7.2-setup-x86 yap " diyor
  3. Ve şimdi yap sudo ./truecrypt-7.2-setup-x86

Kullanımının ./rastgele davranış olmadığını, aslında Taşınabilir İşletim Sistemi Arabirimi standardı (POSIX olarak da bilinir) tarafından belirtilen bir standart olduğunu unutmayın , özellikle "Komut Arama ve Yürütme" bölümüne bakın.

Hatayı yeniden oluşturma

$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh                         
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not  sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/                                                                                                                                                      
$ sudo ./my_script.sh                                                                                                                                                  
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found

NOT : tarafından verilen hata mesajı sudoaçıkça yanıltıcıdır, bu yüzden akılda tutulması gereken bir şeydir; ancak bunun OP'nin sorduğu sorunun özü olmadığını lütfen unutmayın .

Belgeler ve referanslar

Dan bash4.3 kılavuzu, "KOMUTANLIĞI UYGULAMA" bölümünde:

Ad ne bir kabuk işlevi ne de yerleşiktir ve eğik çizgi içermiyorsa, bash, PATH'nin her öğesini bu ada göre yürütülebilir bir dosya içeren bir dizin arar.

Gönderen Betikte çalıştırmak için neden komut dosyası adından önce ./ (dot-slash) gereklidir? :

./ ile çalışır çünkü POSIX , / PAT içeren bir komut adının doğrudan dosya adı olarak kullanılacağını ve $ PATH içindeki bir aramayı bastıracağını belirtir . Aynı etki için tam yol kullanmış olabilirsiniz, ancak ./ daha kısa ve yazılması daha kolaydır.


Aslında sudoçıktı yanıltıcıdır. Aynı olmadan çalışırsanız sudo, içinden başka bir hata alırsınız bash: Permission denied. Ve haklı olarak, betiğe (üzerinden chmod +x) yürütülmesine izin vermediğiniz için .
Ruslan

@ sudoÇıktının yanıltıcı olduğu gerçeği doğrudur, ancak ortaya çıkan hata budur. Bu, geliştiricilere rapor vermek ve düzeltmelerine izin vermek için bir şey olabilir. Ancak bu tartışmanın özü değil - OP'nin böyle bir hata üretmek için neler yaptığını belirlememiz ve onları doğru yola yönlendirmemiz gerekiyordu. Yanıltıcı olsun ya da olmasın - buradaki sorun bu değil.
Sergiy Kolodyazhnyy

Başka bir deyişle, tam olarak kullanmakla aynı /bin/bashşey değildir: Yürütme iznine sahip olmadığınız bir komut dosyasını yürütmenize izin vermez. Birlikte komut dosyası adını önsöz zaman /bin/bash, aslında /bin/basholarak çalıştırılabilir olduğunu, bütün bu önemli olan o yürütülmektedir komuttur. Bunu yapmadığınızda, komut dosyasının kendisi yürütülür, bu da geçerli kabuğunuza veya en üst #!satırda çağrılan her şeye yol açar
Monty Harder

@MontyHarder /bin/bashburada sadece bir örnektir. Aradığımız /bin/bashve yürütülen şeyin yolunu./script.sh belirterek - bu aynı. Komut dosyasını veya ile tamamen farklı bir konudur, burada çalıştırılabilir bir komut dosyasını çalıştırırsınız ve komut dosyasını argüman olarak iletirsiniz - bu arada sözdizimi, çağırdığınız kabuktan başka bir şey için yazılırsa kırılabilir . çalıştırılabilir bir durum, ancak gerçek şu ki, ona tam yol belirtiyorsunuz. bash script.sh/bin/bash script.shcsh/bin/bash
Sergiy Kolodyazhnyy

2
@SergiyKolodyazhnyy bir komut dosyası adını prefacing /bin/bashhatta sadece bashbir de senaryo üzerinde çalıştırılabilir izinlerinin olmayışı çözmek için ortak bir yol. Tam komut yolunu belirtme yok değil bu sorunu çözmek. Yani /bin/bashbu özel durumda özellikle kötü bir örnektir.
Monty Harder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.