Yazarsam
::
bir bash kabuğuna alıyorum:
-bash: ::: command not found
Ancak, yalnızca bir :çıktı verilmez. Bu neden?
Yazarsam
::
bir bash kabuğuna alıyorum:
-bash: ::: command not found
Ancak, yalnızca bir :çıktı verilmez. Bu neden?
Yanıtlar:
: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.
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.
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));
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
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).
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?
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
$ ::
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