apa arti tanda hubung `-` sebelum` bash` pada 'perintah tidak ditemukan' kesalahan?


28

Ketika Anda memasukkan perintah yang tidak valid pada prompt bash Anda mendapatkan pesan

-bash: {command}: command not found

Apa yang -ditandakan oleh awal?


Bagaimana tepatnya Anda menjalankan perintah? Saya mencoba mereplikasi, tetapi saya tidak mendapatkan hasil yang sama - misalnya> jhgjbjbkjln: command not found- tidak ada -bash: di sana. Apakah Anda menggunakan bashdi Unix, Linux, OSX, ...? Saya bertanya karena mungkin ini adalah sesuatu yang diterapkan secara spesifik sebelum pesan kesalahan secara default, dan itu tidak berarti apa-apa ... mungkin.
jimm-cl

@ jo Cobalah ssh computernamedan tidak menghitung perintah Anda untuk mereplikasi.
Bernhard

Jawaban:


27

Ini berarti bahwa itu adalah shell login.

Dari man bash:

Shell login adalah karakter yang argumen pertama nol adalah a -, atau yang dimulai dengan opsi --login.

(Dalam bashterminologi, argumen "nol" adalah nama perintah yang, dalam kasus Anda, adalah bash.) bashMenggunakan ini sebagai sinyal untuk melakukan aktivitas masuk seperti mengeksekusi .bash_profile, dll.

Salah satu cara agar tanda hubung dapat ditambahkan secara otomatis adalah jika shell dimulai dengan exec. Dari manual Bash :

exec [-cl] [-a name] [command [arguments]]

[...] Jika -lopsi ini disediakan, shell menempatkan tanda hubung di awal argumen nol yang diteruskan ke perintah .

Contoh

Bandingkan kedua upaya ini untuk menjalankan perintah nonexistent. Pertama tanpa -l:

$ exec bash
$ nonexistent
bash: nonexistent: command not found

Dan kedua, dengan:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found

3
Saya pikir bagian dari dokumentasi yang Anda kutip tidak cocok dengan penjelasan Anda. Fakta bahwa exec -lmenambahkan tanda hubung adalah cara yang memungkinkan yang dapat menyebabkan bash dijalankan -bash, tetapi dengan sendirinya tidak mengatakan bahwa itu adalah shell login, dan ada peluang yang sangat baik bahwa OP belum menggunakan exec -lsama sekali . Bagian dari dokumentasi yang mengatakan -bashmembuatnya sebagai shell login adalah "INVOKASI Shell login adalah karakter yang argumen pertama nol adalah a -, atau yang dimulai dengan opsi --login."
hvd

@ DVD, setuju. Meskipun benar, jawaban ini tidak tepat.
Stéphane Chazelas

1
"Argumen nol" bukanlah bashterminologi, tetapi konvensi Unix + pengindeksan C: Setiap program akan melewati daftar parameter, yang entri awalnya adalah nama program, diikuti oleh argumen. Karena array C diindeks mulai dengan nol, argumen nol (yaitu, argumen nol) adalah nama program, dan argumen aktual dimulai dengan indeks 1.
celtschk

15

Jawaban lain baik-baik saja sejauh ini, tetapi perlu disebutkan bahwa fitur ini lebih umum daripada bash.

Sejak zaman kuno, loginprogram telah menambahkan tanda hubung pada argv[0]saat menjalankan shell pengguna, dan shell telah mengenali ini sebagai tanda bahwa ia harus berperilaku sebagai "shell login". Itu didokumentasikan dalam halaman manual V7 di sini: login (1) , sh (1) .

Semua program yang menyediakan layanan seperti login (otentikasi pengguna dan menjalankan shell) harus mengikuti aturan "dash sebelumnya". Sebagai contoh, sshd melakukan seperti yang Anda lihat di ssh / session.c di bawah komentar ini:

/*
 * If we have no command, execute the shell.  In this case, the shell
 * name to be passed in argv[0] is preceded by '-' to indicate that
 * this is a login shell.
 */

Semua kerang mengenali dasbor utama. -lOpsi yang setara tidak ada di shell Bourne klasik atau csh asli, tetapi sebagian besar shell yang lebih baru (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish dan semua versi semi-baru-baru dari csh) memilikinya.


2
Meskipun sebagian besar shell sekarang memiliki -lopsi, loginmasih tidak menggunakannya. Semua shell diharapkan mengenali awalan argv[0]sebagai mekanisme "resmi".
Barmar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.