Dấu gạch ngang `-` trước khi lỗi 'bash` on' không tìm thấy 'có nghĩa là gì?


28

Khi bạn nhập một lệnh không hợp lệ tại dấu nhắc bash, bạn nhận được thông báo

-bash: {command}: command not found

Những gì -ngay từ đầu có nghĩa là gì?


Làm thế nào chính xác là bạn đang chạy lệnh? Tôi đã cố gắng sao chép, nhưng tôi không nhận được kết quả tương tự - ví dụ> jhgjbjbkjln: command not found- không có -bash: trong đó. Bạn đang sử dụng bashtrong Unix, Linux, OSX, ...? Tôi hỏi bởi vì có thể đây là một cái gì đó được triển khai cụ thể đặt trước thông báo lỗi theo mặc định và nó không có nghĩa gì cả ... có thể.
jimm-cl

@jim Hãy thử ssh computernamevà lệnh không đếm của bạn để nhân rộng.
Bernhard

Câu trả lời:


27

Nó có nghĩa là nó là một vỏ đăng nhập.

Từ man bash:

Một vỏ đăng nhập là một vỏ có ký tự đầu tiên của đối số 0 là - hoặc bắt đầu bằng tùy chọn --login.

(Theo bashthuật ngữ, đối số "zeroth" là tên lệnh, trong trường hợp của bạn là bash.) bashSử dụng điều này như một tín hiệu để thực hiện các hoạt động đăng nhập như thực thi .bash_profile, v.v.

Một cách mà dấu gạch ngang có thể được thêm tự động là nếu vỏ được bắt đầu bằng exec. Từ hướng dẫn Bash :

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

[...] Nếu -ltùy chọn được cung cấp, shell sẽ đặt dấu gạch ngang ở đầu đối số zeroth được truyền cho lệnh .

Thí dụ

So sánh hai lần thử này để chạy lệnh nonexistent. Đầu tiên không có -l:

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

Và, thứ hai, với:

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

3
Tôi nghĩ rằng một phần của tài liệu bạn trích dẫn không phù hợp với lời giải thích của bạn. Thực tế là exec -lprepends một dấu gạch ngang là một cách thể có khả năng gây bash được chạy như -bash, nhưng điều đó tự nó không nói rằng đó là một vỏ đăng nhập, và có một cơ hội rất tốt mà OP đã không được sử dụng exec -lở tất cả các . Một phần của tài liệu nói rằng -bashlàm cho nó một vỏ đăng nhập là "HÓA ĐƠN Một vỏ đăng nhập là một ký tự đầu tiên của đối số 0 là - hoặc một bắt đầu bằng tùy chọn --login."
hvd

@hvd, đồng ý. Mặc dù đúng, câu trả lời này bỏ lỡ điểm.
Stéphane Chazelas

1
"Đối số zeroth" không phải là bashthuật ngữ, nhưng quy ước Unix + lập chỉ mục C: Mỗi chương trình được thông qua một danh sách tham số, với mục nhập ban đầu là tên chương trình, theo sau là các đối số. Vì các mảng C được lập chỉ mục bắt đầu bằng 0, nên đối số 0 (nghĩa là đối số zeroth) là tên chương trình và các đối số thực tế bắt đầu bằng chỉ mục 1.
celtschk

15

Câu trả lời khác là tốt cho đến nay, nhưng điều đáng nói là tính năng này chung chung hơn bash.

Từ thời xa xưa, loginchương trình đã chuẩn bị một dấu gạch ngang argv[0]khi nó thực thi trình bao của người dùng và trình bao đã nhận ra đây là một dấu hiệu cho thấy nó nên hoạt động như một "vỏ đăng nhập". Nó được ghi lại trong các trang của V7 tại đây: login (1) , sh (1) .

Tất cả các chương trình cung cấp dịch vụ giống như đăng nhập (xác thực người dùng và chạy shell) phải tuân theo quy tắc "dấu gạch đầu dòng". Ví dụ: sshd thực hiện như bạn có thể thấy trong ssh / session.c dưới bình luận này:

/*
 * 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.
 */

Tất cả các vỏ nhận ra dấu gạch ngang hàng đầu. -lTùy chọn tương đương không tồn tại trong shell Bourne cổ điển hoặc csh gốc, nhưng hầu hết các shell mới hơn (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish và bất kỳ phiên bản bán gần đây nào của csh) đều có nó.


2
Mặc dù hầu hết các shell hiện có -ltùy chọn, loginvẫn không sử dụng nó. Tất cả các shell được dự kiến ​​sẽ nhận ra tiền tố trên argv[0]là cơ chế "chính thức".
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.