Prostym rozwiązaniem jest umieszczenie pojedynczego cudzysłowu ( ') na początku i innego pojedynczego cudzysłowu na końcu oraz zastąpienie każdego 'znaku w nazwie pliku sekwencją 4 znaków '\''. Wszystkie znaki tracą swoje specjalne znaczenie w ciągu pojedynczego cudzysłowu, z wyjątkiem 'siebie, która oznacza koniec łańcucha. Sekwencja '\''kończy dosłowny cytat, bezpośrednio po nim cytowany cytat i otwiera nowy literał cytowany. Zatem nazwa pliku
This file's name has some weird characters!
Will you manage to escape them?
można cytować w następujący sposób:
somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'
Podwójne cudzysłowy mają bardziej złożone reguły ucieczki i nie pozwalają na dołączenie wykrzyknika, !jeśli aktywowane jest zastępowanie historii, więc nie będę ich więcej rozważał.
Alternatywnym podejściem jest ochrona znaków odwrotnym ukośnikiem. Działa to dla każdej postaci oprócz znaków nowej linii; w przypadku nowego wiersza umieszczenie go w pojedynczych cudzysłowach (lub podwójnych cudzysłowach) jest jedynym rozwiązaniem. Jeśli chcesz zminimalizować liczbę odwrotnych ukośników, aby przedstawić użytkownikowi cytowaną nazwę, możesz ograniczyć ją do miejsc, w których potrzebny jest odwrotny ukośnik; Jednak im więcej pomijasz ukośników odwrotnych, tym bardziej ryzykujesz, że zapomnisz jednego, który jest potrzebny. Litery, cyfry i znaki spoza ASCII są zawsze ok¹. Cytuj białe znaki i znaki interpunkcyjne, gdy nie masz pewności.
Przy typowej powłoce (ksh, bash lub zsh), musisz zacytować następujące znaki przynajmniej w niektórych okolicznościach.
- Biała spacja (spacja, tabulator, nowa linia - pamiętając, że nowej linii nie można cytować za pomocą odwrotnego ukośnika).
! - ekspansja historii.
" - składnia powłoki.
#- początek komentarza poprzedzony spacją; symbole wieloznaczne zsh.
$ - składnia powłoki.
& - składnia powłoki.
' - składnia powłoki.
(- nawet w środku słowa: rozszerzone globs ksh (dostępne również w bash i zsh); symbole wieloznaczne zsh.
)(patrz ()
* - sh symbol wieloznaczny.
, - tylko wewnątrz rozszerzenia nawiasów klamrowych.
; - składnia powłoki.
< - składnia powłoki.
= - w zsh, gdy jest na początku nazwy pliku (rozszerzenie nazwy pliku przy pomocy PATH).
> - składnia powłoki.
? - sh symbol wieloznaczny.
[ - sh symbol wieloznaczny.
\ - składnia powłoki.
] - możesz uciec od pozostawienia go bez cudzysłowu.
^- ekspansja historii; Zsh wildcard.
` - składnia powłoki.
{ - rozszerzenie nawiasów klamrowych.
| - składnia powłoki.
} - należy uciec w Zsh, inne pociski są bardziej łagodne, gdy nie ma pasującego otwierającego nawiasu klamrowego.
~- rozszerzenie katalogu domowego, gdy jest na początku nazwy pliku; znak zsh; zawsze bezpieczny, gdy jest to ostatnia postać.
Kilka dodatkowych postaci może czasem wymagać specjalnego postępowania:
-nie jest specjalny dla powłoki, ale gdy jest na początku argumentu polecenia, wskazuje opcję. Nie można go chronić cudzysłowami, ponieważ specjalna obsługa znajduje się w poleceniu, a nie w powłoce. Aby zabezpieczyć nazwę pliku, która zaczyna się od -, możesz wstawić ./przed nią - w ten sposób jest to nadal ten sam plik, ale argument już się nie zaczyna -.
.sam w sobie nie jest wyjątkowy, ale pliki kropek są *domyślnie wyłączone z globusów.
:nie jest specjalny dla powłoki, ale niektóre polecenia analizują ją specjalnie, np. aby wskazać plik zdalny ( hostname:filename). Zapoznaj się z dokumentacją polecenia, aby dowiedzieć się, jak radzić sobie z nazwami plików zawierającymi dwukropki.
¹ Chyba że użytkownik skonfigurował alternatywne znaki rozszerzenia historii. Niektóre powłoki na to pozwalają. To kolejny powód, aby używać pojedynczych cudzysłowów zamiast odwrotnych ukośników.