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
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.
Meskipun sebagian besar shell sekarang memiliki -lopsi, loginmasih tidak menggunakannya. Semua shell diharapkan mengenali awalan argv[0]sebagai mekanisme "resmi".
jhgjbjbkjln: command not found
- tidak ada-bash:
di sana. Apakah Anda menggunakanbash
di 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.ssh computername
dan tidak menghitung perintah Anda untuk mereplikasi.Jawaban:
Ini berarti bahwa itu adalah shell login.
Dari
man bash
:(Dalam
bash
terminologi, argumen "nol" adalah nama perintah yang, dalam kasus Anda, adalahbash
.)bash
Menggunakan 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 :Contoh
Bandingkan kedua upaya ini untuk menjalankan perintah
nonexistent
. Pertama tanpa-l
:Dan kedua, dengan:
sumber
exec -l
menambahkan 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 menggunakanexec -l
sama sekali . Bagian dari dokumentasi yang mengatakan-bash
membuatnya sebagai shell login adalah "INVOKASI Shell login adalah karakter yang argumen pertama nol adalah a -, atau yang dimulai dengan opsi --login."bash
terminologi, 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.Jawaban lain baik-baik saja sejauh ini, tetapi perlu disebutkan bahwa fitur ini lebih umum daripada bash.
Sejak zaman kuno,
login
program telah menambahkan tanda hubung padaargv[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:
Semua kerang mengenali dasbor utama.
-l
Opsi 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.sumber
-l
opsi,login
masih tidak menggunakannya. Semua shell diharapkan mengenali awalanargv[0]
sebagai mekanisme "resmi".