Jika saya mengetik
::
menjadi bash shell, saya mendapatkan:
-bash: ::: command not found
Tapi, hanya satu yang :
tidak menghasilkan output. Kenapa ini?
command-line
bash
NerdOfLinux
sumber
sumber
Jawaban:
The
:
shell built-in vs tidak ada::
Perintah
:
built-in shell ada (perhatikan perbedaan antara perintah eksternal dan built-in ) yang tidak melakukan apa-apa; itu hanya mengembalikan kesuksesan, seperti halnyatrue
perintah. The:
built-in standar dan ditetapkan oleh standar POSIX , di mana itu juga dikenal sebagai "nol utilitas". Ini sering digunakan untuk pengujian atau untuk menjalankan loop tak terbatas seperti padawhile : ; do ...;done
Namun,
::
- dua karakter titik dua bersama-sama - ditafsirkan sebagai satu "kata" pada shell, dan dianggap sebagai perintah yang dimasukkan pengguna. Shell akan melalui proses pengecekan built-in, lalu direktori mana pun dalamPATH
variabel untuk keberadaan perintah itu. Tetapi tidak ada::
perintah internal atau internal::
. Karena itu, itu menghasilkan kesalahan.Nah, apa format khas untuk kesalahan?
Jadi, apa yang Anda lihat bukan 3 titik dua tetapi apa yang Anda ketikkan disisipkan ke dalam format kesalahan standar.
Perhatikan juga, yang
:
dapat mengambil argumen baris perintah, yaitu sah untuk dilakukan:Dalam hal ini, shell akan menganggap itu sebagai dua "kata", salah satunya adalah perintah dan yang lainnya sebagai parameter posisi. Itu juga tidak akan menghasilkan kesalahan! (Lihat juga catatan historis (nanti dalam jawaban ini) tentang penggunaan
:
parameter dengan posisi).Dalam cangkang selain bash
Perhatikan bahwa pemformatan dapat bervariasi di antara berbagai shell yang berbeda. Untuk
bash
,,ksh
danmksh
perilaku konsisten. Misalnya,/bin/sh
shell default Ubuntu (yang sebenarnya/bin/dash
):di mana 1 adalah nomor perintah (setara dengan nomor baris dalam naskah)
csh
sebaliknya tidak menghasilkan pesan kesalahan sama sekali:Bahkan, jika Anda menjalankan
strace -o csh.trace csh -c ::
, jejak jejak dalamcsh.trace
file mengungkapkan bahwacsh
keluar dengan status keluar 0 (tidak ada kesalahan). Tetapitcsh
apakah menghasilkan kesalahan (tanpa mengeluarkan namanya):Pesan kesalahan
Secara umum, item pertama dalam pesan kesalahan haruslah proses atau fungsi eksekusi (shell Anda mencoba untuk mengeksekusi
::
, maka pesan kesalahan tersebut berasal dari shell). Misalnya, di sini proses pelaksanaannya adalahstat
:Bahkan, POSIX mendefinisikan fungsi perror () , yang menurut dokumentasi mengambil argumen string, kemudian menampilkan pesan kesalahan setelah titik dua, dan kemudian baris baru. Mengutip:
Dan argumen string untuk secara
perror()
teknis bisa apa saja, tapi tentu saja untuk kejelasan itu biasanya nama fungsi atauargv[0]
.Sebaliknya, GNU memiliki serangkaian fungsi dan variabel untuk penanganan kesalahan , yang dapat digunakan oleh seorang programmer
fprintf()
untuk melakukanstderr
streaming. Seperti yang ditunjukkan salah satu contoh pada halaman tertaut, sesuatu seperti ini dapat dilakukan:Catatan sejarah
Dalam shell Unix dan Thompson yang lama,
:
digunakan dengangoto
pernyataan (yang menurut pengguna bernama Perderabo pada utas ini bukan sebuah shell bawaan ). Kutipan dari manual:Jadi Anda bisa melakukan sesuatu seperti ini untuk membuat skrip loop tak terbatas:
sumber
command.com
dan Windowscmd.exe
memiliki situasi yang serupa tetapi berlawanan::
secara eksplisit merupakan label goto (bukan perintah) dan sering digunakan ulang sebagai karakter komentar (misalnya:: This is a comment
).Tanda titik dua terakhir hanya sebagian dari pesan "tidak ditemukan" default:
Alasan satu titik tidak menghasilkan apa-apa adalah itu
:
adalah perintah yang valid - meskipun tidak melakukan apa-apa (kecuali kembaliTRUE
). DariSHELL BUILTIN COMMANDS
bagianman bash
:Anda kadang-kadang akan melihatnya dalam konstruksi seperti
Lihat misalnya Apa tujuan yang dibangun usus besar?
sumber
Coba perintah lain yang tidak ada dan Anda akan melihat bahwa
:
melayani tujuan normal dalam bahasa Inggris:sumber
Tanda titik dua yang ditambahkan adalah bagian dari pesan kesalahan itu sendiri. Jika salah satu jenis
cd ow
itu menghasilkanbash: cd: ow: No such file or directory
, yang menunjukkan bahwa kesalahan diletakkan di usus besar tambahan: No such file or directory
sumber
yang ke-3 adalah pengatur jarak dari pemformatan
dalam bash a
:
adalah instruksi baris kosongsumber
Anda mendapatkan 3 titik dua karena format galat berisi titik dua:
sumber