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 true
komut 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 PATH
bu 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
, ksh
ve mksh
davranış tutarlıdır. Örneğin, Ubuntu'nun varsayılan /bin/sh
kabuğ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.trace
dosyadaki izleme çıktısı, csh
çıkış durumu 0 ile çıkan (hata yok) ortaya çıkarır . Ancak tcsh
hatayı çı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 goto
açı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.com
ve Windows ' cmd.exe
da 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 COMMANDS
bö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 ow
o sonuçlanır bash: cd: ow: No such file or directory
hata 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