znaczenie „” (apostrof) w komendach terminalowych

11

Z jakiegoś dziwnego powodu próbowałem „” jako separatora słów w identyfikatorach, jak w:

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

Wynik jest taki, jak pokazano powyżej, tzn. Natychmiastowa zmiana na „>” i system oczywiście czeka na więcej informacji z mojej strony. Jak widzisz, musiałem nacisnąć Ctrl-C, aby uciec. To samo dzieje się przy użyciu innych poleceń, takich jak

$ ls foo'bar
$ mkdir foo'bar

Jestem ciekawy sensu tego wszystkiego, właśnie to specjalne znaczenie „” ma w komendach terminalowych (tak wyjątkowych, że rozbiera się je nawet wewnątrz identyfikatorów).

Dodatkowo: na marginesie chciałbym również znać zestaw znaków specjalnych lub w inny sposób nieprawidłowy w nazwach plików i folderów, zarówno w systemach uniksowych, jak i Windows (aby uzyskać wspólny podzbiór bezpiecznych) (w szczególności, co ze wszystkimi spoza ASCII?).

Dziękuję, Denis

denis 63
źródło
W świecie Linuksa dozwolone są wszystkie znaki z wyjątkiem \ 0 (null) i /. Nie oznacza to jednak, że wszystkie są wskazane. Wiele osób uważa, że ​​najlepiej jest unikać postaci, które mają specjalne znaczenie dla powłoki. Jeśli chcesz wiedzieć o systemie Windows, zapoznaj się z dokumentacją dotyczącą systemu Windows.
Scott Severance,

Odpowiedzi:

15

Znak „jest bardzo potężnym znakiem, ilekroć jest używany w dowolnym poleceniu powłoki. Zasadniczo „(znaki apostrofowe) wyłącza wszelkiego rodzaju transformacje lub modyfikacje. Rozważyłby wszystko, co jest objęte znakami „jako pojedynczy byt, tj. Pojedynczy parametr. Absolutnie nie nastąpiłby żaden zamiennik ani ekspansja.

Przykład:

 $ echo '$HOME'

wygeneruje na wyjściu $HOMEsam łańcuch i nie wydrukuje ścieżki do twojego katalogu domowego. Ponieważ pojedyncze cudzysłowy zapobiegają jakiejkolwiek ekspansji, podstawianie i proste uważa, że ​​cokolwiek jest obecne jako prosty parametr sam w sobie.

Jeśli chcesz użyć apostrofu w obecnej postaci, musisz uciec od niego:

 $ mkdir foo\'bar

 $ cd foo\'bar

Jeśli to nie nastąpi, zaczeka na zamknięcie pary, tak jak to miało miejsce w twoim pierwszym przykładzie.

Tak więc, poprawione, twoje polecenie będzie:

 $ export foo\'bar=1

UWAGA: Jak zauważył Milan Todorovic, nie będzie to ważne, ponieważ w tym przypadku nie można użyć apostrofu.

Frantique
źródło
1
@ denis63 proszę przyjąć odpowiedź, jeśli to jest to, co trzeba zobaczyć :)
Rinzwind
7

Postać 'jest postacią specjalną. Używasz go, aby zaznaczyć część wiersza poleceń, która nie zostanie zmieniona (np. Nie zastępuj symboli wieloznacznych). Na przykład:

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

Oznacza to, że argumentem lsbyło, bla*a nie wszystko, co zaczyna się od bla.

Powodem, dla którego dostajesz >postać, jest to, że musisz użyć jednego 'do otwarcia, a drugiego 'do zamknięcia części, która nie zostanie zmieniona.

Jeśli chcesz używać 'w nazwach folderów musisz uciec to tak: \'. Więc jeśli chcesz wyświetlić listę nazwanych folderów foo'bar, wpisz ls foo\'bar.

Aha, i nie jestem pewien, czy można używać 'w nazwach zmiennych środowiskowych. Myślę, że nie można używać export foo\'bar=1,

Mam nadzieję że to pomoże.

Milan Todorovic
źródło
Głosuj za spostrzeżeniami na temat ograniczeń nazw zmiennych środowiskowych.
Frantique,
Nie mogę jeszcze głosować (nowość w askubuntu), ale już istnieje. Sprawdzono nazwy zmiennych env, tak jak mówisz. (Czuję się trochę głupio, że sam nie myślałem o otwieraniu / zamykaniu ograniczników, ale wtedy uważałem „” za prawdziwy apostrof, a nie za pojedynczy cytat). Denis
denis 63