Komut olarak iki sütun için neden hata mesajı (: bash'daki :): üç kolon var, fakat tek bir kolon çıkış vermedi mi?


Yanıtlar:


40

Var olan :olmayan bir kabuk::

: Kabuk yerleşik komutu Varlığından (not arasındaki farkı harici ve dahili komutları ) hiçbir şey yapmaz ki; sadece truekomut gibi, sadece başarıyı döndürür . :Dahili standart ve POSIX standartlarında tanımlanan o da "boş fayda" olarak bilinen,. Sık sık test edildiği gibi veya sonsuz döngüler çalıştırmak için kullanılırwhile : ; do ...;done

bash-4.3$ type :
: is a shell builtin

Bununla birlikte, ::- iki sütun karakteri birlikte - kabuğa bir "kelime" olarak yorumlanır ve kullanıcının girdiği bir komut olduğu varsayılır. Kabuk, daha sonra PATHbu komutun varlığına ilişkin değişkendeki herhangi bir dizini, sonradan yerleşikleri kontrol etme sürecinden geçer . Fakat ne yerleşik :: ne de harici bir komut yoktur ::. Bu nedenle, bu bir hata üretir.

Peki, bir hatanın tipik bir formatı nedir?

<shell>: <command user typed>: error message

Böylece, gördüğünüz şey 3 sütun değil, standart hata biçiminde yapıştırdığınız şeydir.

Ayrıca, :komut satırı argümanları alabilir, yani yapılması yasaldır.

: :

Bu durumda, kabuk, biri komut, diğeri konumsal parametre olan iki "kelime" olarak değerlendirilecektir. Bu da hata yapmaz! (Ayrıca :konumsal parametrelerin kullanımıyla ilgili tarihsel nota (bu cevabın ilerleyen kısımlarına bakınız ) bakınız.


Bash dışındaki kabuklarda

Biçimlendirmenin farklı kabuklar arasında da değişebileceğini unutmayın. Çünkü bash, kshve mkshdavranış tutarlıdır. Örneğin, Ubuntu'nun varsayılan /bin/shkabuğu (ki aslında /bin/dash):

$ dash
$ ::
dash: 1: ::: not found

burada komut numarası 1'dir (bir komut dosyasındaki satır sayısına eşdeğer).

csh aksine, hiçbir hata mesajı üretmez:

$ csh
% ::
%

Aslında, çalıştırırsanız strace -o csh.trace csh -c ::, csh.tracedosyadaki izleme çıktısı, cshçıkış durumu 0 ile çıkan (hata yok) ortaya çıkarır . Ancak tcshhatayı çıktıyor (yine de adını çıkarmadan):

$ tcsh
localhost:~> ::
::: Command not found.

Hata mesajları

Genel olarak, hata iletisindeki ilk öğe yürütme işlemi veya işlevi olmalıdır (kabuğunuzun yürütmeye çalışması ::, bu nedenle hata mesajı kabuktan gelir). Örneğin, burada yürütme işlemi şöyledir stat:

$ stat noexist
stat: cannot stat 'noexist': No such file or directory

Aslında POSIX , belgelere göre bir dizge argümanı alan perror () işlevini, ardından iki noktadan sonra hata iletisini ve ardından yeni satır çıktısını tanımlar . Alıntı:

Perror () işlevi, standart hata akışına aşağıdaki gibi yazılacak olan dile bağlı bir hata mesajıyla errno sembolü üzerinden erişilen hata numarasını eşleştirecektir:

  • İlk önce (s boş bir işaretçi değilse ve s ile gösterilen karakter boş bayt değil), ardından s ile gösterilen bir iki nokta üst üste ve bir <boşluk>.

  • Sonra bir hata mesajı dizesi ve ardından <newline>.

Ve perror()teknik olarak dize argümanı herhangi bir şey olabilir, ama elbette netlik için tipik olarak işlev ismi veya argv[0].

Bunun aksine, GNU, bir programcının akış sağlamak fprintf()için kullanabileceği, hata yönetimi için kendi işlev ve değişkenlerine sahiptir stderr. Bağlantılı sayfadaki örneklerden birinin gösterdiği gibi, bunun gibi bir şey yapılabilir:

  fprintf (stderr, "%s: Couldn't open file %s; %s\n",
           program_invocation_short_name, name, strerror (errno));

Tarihsel not

Eski Unix ve Thompson kabuğunda, :birlikte kullanılan gotoaçıklamada (on Perderabo adlı kullanıcıya göre bu konuya yerleşik bir kabuk değildi). Kılavuzdan alıntı:

Komut dosyasının tamamı a ile başlayan bir satır için aranır: ilk boş olmayan karakter, ardından bir veya daha fazla boşluk ve ardından etiket. Eğer böyle bir çizgi bulunursa, goto komut dosyası ofsetini etiketten sonra çizgiye konumlandırır ve çıkar. Bu, kabuğun etiketli satıra aktarılmasına neden olur.

Böylece sonsuz bir döngü komut dosyası yapmak için böyle bir şey yapabilirsiniz:

: repeat
echo "Hello World"
goto repeat

"3 sütun" yazım hatası "3 sütun"
Barmar

1
DOS command.comve Windows ' cmd.exeda benzer ancak tam tersi bir durum var: :açıkça bir etiket (bir komut değil :: This is a comment).
Aralık'ta 17:17

54

Son sütun, varsayılan "bulunamadı" iletisinin yalnızca bir parçasıdır:

$ x
x: command not found
$ ::
::: command not found

Tek bir kolonun hiçbir şey üretmemesinin nedeni : , geçerli bir komuttur - hiçbir şey yapmamasına rağmen (dönüş hariç TRUE). Gönderen SHELL BUILTIN COMMANDSbölümünde man bash:

   : [arguments]
          No effect; the command does nothing beyond  expanding  arguments
          and  performing any specified redirections.  A zero exit code is
          returned.

Bazen bunu gibi yapılarda göreceksiniz

while :
do
  something
done

Örneğin bkz . Kolon yerleşiminin amacı nedir?


evet bu .. benim daha en kapsamlı açıklama .. çok daha anlamlı olduğunu çok daha iyi izah: D
John Orion

8

Var olmayan diğer herhangi bir komutu deneyin ve :İngilizce'nin normal amacına hizmet ettiğini göreceksiniz :

$ ---
---: command not found

6

Eklenen kolon, hata mesajının bir parçasıdır. Bir türlerinde ise cd owo sonuçlanır bash: cd: ow: No such file or directoryhata ekstra kolonda koyuyor gösterileri,: No such file or directory


6
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found

Üçüncüsü biçimlendirmeden bir boşluk

bash a :boş bir satır geçersiz komuttur


4

Hata formatı iki nokta üst üste içerdiğinden 3 sütun alırsınız:

bash: <command>: command not found
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.