ý nghĩa của '' '(dấu nháy đơn) trong các lệnh đầu cuối


11

Vì một số lý do kỳ lạ, tôi đã thử "'" làm dấu tách từ trong định danh, như trong:

$ export foo'bar=1
> 
> ^C
$ 

Kết quả là như được hiển thị ở trên, id est nhắc nhở thay đổi thành ">" và hệ thống rõ ràng đang chờ thêm thông tin từ phía tôi. Như bạn thấy, tôi đã phải ctrl-C để trốn thoát. Điều tương tự cũng xảy ra khi sử dụng các lệnh khác như

$ ls foo'bar
$ mkdir foo'bar

Tôi tò mò về ý nghĩa của tất cả những điều này, đó là ý nghĩa đặc biệt của "'" trong các lệnh đầu cuối (đặc biệt là nó thực sự bị tách rời ngay cả trong các id).

Bổ sung: Ngoài ra, tôi cũng muốn biết tập hợp các ký tự đặc biệt hoặc không hợp lệ trong tên tệp và thư mục, cả trong các hệ thống giống như Unix và Windows (để có tập hợp con chung của các ký tự an toàn) (cụ thể là về tất cả không phải ASCII?).

Cảm ơn bạn


Trong thế giới Linux, tất cả các ký tự ngoại trừ \ 0 (null) và / đều được phép. Tuy nhiên, điều đó không có nghĩa là tất cả chúng đều được khuyến khích. Nhiều người cho rằng tốt nhất là tránh các ký tự có ý nghĩa đặc biệt với vỏ. Nếu bạn muốn biết về Windows, hãy tham khảo tài liệu tham khảo Windows.
Scott Severance

Câu trả lời:


15

Ký tự 'là một ký tự rất mạnh bất cứ khi nào được sử dụng trong bất kỳ lệnh shell nào. Về cơ bản, '(dấu nháy đơn) vô hiệu hóa tất cả các loại biến đổi hoặc sửa đổi. Nó sẽ xem xét bất cứ thứ gì được đính kèm với dấu 'là một thực thể đơn lẻ, tức là một tham số. Tuyệt đối không có loại thay thế hoặc mở rộng sẽ diễn ra.

Thí dụ:

 $ echo '$HOME'

sẽ tự sản xuất chuỗi đầu ra $HOMEvà sẽ không in đường dẫn đến thư mục chính của bạn. Vì các trích dẫn đơn ngăn chặn mọi loại mở rộng, thay thế và đơn giản xem xét bất cứ điều gì có mặt như một tham số đơn giản.

Nếu bạn muốn sử dụng dấu nháy đơn như hiện tại, bạn phải thoát nó:

 $ mkdir foo\'bar

 $ cd foo\'bar

Nếu nó không được thoát, nó sẽ đợi cho cặp của nó được đóng lại, giống như nó đã xảy ra trong ví dụ đầu tiên của bạn.

Vì vậy, sửa chữa, lệnh của bạn sẽ là:

 $ export foo\'bar=1

LƯU Ý: Như Milan Todorovic nhận thấy, điều này sẽ không hợp lệ, vì bạn không thể sử dụng dấu nháy đơn trong trường hợp này.


1
@ denis63 vui lòng chấp nhận câu trả lời nếu đó là những gì bạn cần xem :)
Rinzwind

7

Nhân vật 'là một nhân vật đặc biệt. Bạn sử dụng nó để đánh dấu một phần của mục nhập dòng lệnh sẽ không được thay đổi (ví dụ: không thay thế cho ký tự đại diện). Ví dụ:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Lập luận biện rằng đây cho lsbla*và không phải mọi thứ bắt đầu với bla.

Lý do tại sao bạn có được >nhân vật là bởi vì bạn phải sử dụng một 'để mở và một 'cho phần đóng sẽ không được thay đổi.

Nếu bạn muốn sử dụng 'trong tên thư mục, bạn phải thoát nó như thế này : \'. Vì vậy, nếu bạn muốn liệt kê thư mục có tên foo'barbạn nên gõ ls foo\'bar.

Ồ, và tôi không chắc có thể sử dụng 'tên biến môi trường hay không. Tôi nghĩ rằng bạn không thể sử dụng export foo\'bar=1,

Hi vọng điêu nay co ich.


Upvote cho quan sát của bạn về hạn chế tên biến môi trường.
Frantique

Chưa thể upvote (mới đối với Ubuntu), nhưng cảm giác là có. Đã kiểm tra tên env var, nó giống như bạn nói. . Denis
denis 63
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.