Giải pháp đơn giản là đặt một trích dẫn ( '
) ở đầu và một trích dẫn khác ở cuối và thay thế mọi '
ký tự bên trong tên tệp bằng chuỗi 4 ký tự '\''
. Tất cả các ký tự mất ý nghĩa đặc biệt của chúng trong một chuỗi trích dẫn, ngoại trừ '
chính nó đánh dấu sự kết thúc của chuỗi. Trình tự '\''
kết thúc bằng chữ được trích dẫn đơn, ngay sau đó là một trích dẫn đơn được trích dẫn và mở ra một chữ mới được trích dẫn. Do đó, tên tập tin
This file's name has some weird characters!
Will you manage to escape them?
có thể được trích dẫn như sau:
somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'
Dấu ngoặc kép có các quy tắc thoát phức tạp hơn và không cho phép bạn bao gồm dấu chấm than !
nếu thay thế lịch sử được kích hoạt, vì vậy tôi sẽ không xem xét chúng thêm nữa.
Một cách tiếp cận khác là bảo vệ các ký tự có dấu gạch chéo ngược. Điều này hoạt động cho mọi nhân vật ngoại trừ dòng mới; đối với một dòng mới, đặt nó trong dấu ngoặc đơn (hoặc dấu ngoặc kép) là giải pháp duy nhất. Nếu bạn muốn giảm thiểu số lượng dấu gạch chéo ngược để hiển thị tên được trích dẫn cho người dùng, bạn có thể giới hạn nó ở những nơi cần sử dụng dấu gạch chéo ngược; tuy nhiên, bạn càng bỏ qua nhiều dấu gạch chéo ngược, bạn càng có nguy cơ quên một thứ cần thiết. Chữ cái, chữ số và ký tự không phải ASCII luôn ok. Trích dẫn khoảng trắng và dấu chấm câu bất cứ khi nào bạn không chắc chắn.
Với hệ vỏ điển hình (ksh, bash hoặc zsh), bạn cần trích dẫn các ký tự sau trong ít nhất một số trường hợp.
- Khoảng trắng (dấu cách, tab, dòng mới - ghi nhớ rằng dòng mới không thể được trích dẫn bằng dấu gạch chéo ngược).
!
- mở rộng lịch sử.
"
- cú pháp shell.
#
- bình luận bắt đầu khi đi trước khoảng trắng; ký tự đại diện zsh.
$
- cú pháp shell.
&
- cú pháp shell.
'
- cú pháp shell.
(
- ngay cả ở giữa một từ: ksh kéo dài (cũng có sẵn trong bash và zsh); ký tự đại diện zsh.
)
(xem (
)
*
- ký tự đại diện.
,
- chỉ bên trong mở rộng niềng răng.
;
- cú pháp shell.
<
- cú pháp shell.
=
- trong zsh, khi nó ở đầu tên tệp (mở rộng tên tệp với tra cứu PATH).
>
- cú pháp shell.
?
- ký tự đại diện.
[
- ký tự đại diện.
\
- cú pháp shell.
]
- bạn có thể thoát khỏi việc bỏ nó.
^
- mở rộng lịch sử; ký tự đại diện zsh.
`
- cú pháp shell.
{
- Niềng răng mở rộng.
|
- cú pháp shell.
}
- cần phải được thoát trong zsh, các shell khác sẽ dễ dàng hơn khi không có nẹp mở phù hợp.
~
- mở rộng thư mục nhà khi nó ở đầu tên tệp; ký tự đại diện zsh; luôn luôn an toàn khi đó là nhân vật cuối cùng.
Một vài nhân vật nữa có thể yêu cầu xử lý đặc biệt đôi khi:
-
không phải là đặc biệt cho shell, nhưng khi nó bắt đầu một đối số lệnh, nó chỉ ra một tùy chọn. Nó không thể được bảo vệ bằng dấu ngoặc kép vì việc xử lý đặc biệt nằm trong lệnh chứ không phải trong trình bao. Để bảo vệ tên tệp bắt đầu bằng -
, bạn có thể đặt ./
trước tên đó - theo cách này nó vẫn là cùng một tệp, nhưng đối số không bắt đầu -
nữa.
.
Bản thân nó không đặc biệt, nhưng các tệp chấm được loại trừ khỏi các khối *
theo mặc định.
:
không phải là đặc biệt cho shell, nhưng một số lệnh phân tích nó đặc biệt, ví dụ để chỉ ra một tệp từ xa ( hostname:filename
). Tham khảo tài liệu của lệnh để xem cách đối phó với tên tệp có chứa dấu hai chấm.
¹ Trừ khi người dùng đã cấu hình các nhân vật lịch sử mở rộng thay thế. Một số vỏ cho phép điều này. Đây là một lý do khác để sử dụng dấu ngoặc đơn thay vì dấu gạch chéo ngược.