Jak mogę powtórzyć „$” w dokumencie doc w bash?
Na przykład chcę mieć plik z zawartością na zdalnym serwerze, takim jak $ABC=home_dir
.
$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
Ale byłoby to traktowane jako zmienna. Jak mogę wydrukować literał $
?
scp
go?Odpowiedzi:
Jeśli chcesz napisać dokument tutaj i nie chcesz, aby ŻADNY z dokumentów został rozwinięty lub zinterpretowany przez znaki specjalne, możesz zacytować etykietę pojedynczymi cudzysłowami:
Jednak twoja sytuacja opisana w twoim przykładzie jest znacznie bardziej złożona, ponieważ tak naprawdę wysyłasz tę zawartość za pośrednictwem ssh do zdalnego systemu, który ma być uruchamiany przez sudo, które również wywołuje powłokę (i aby powłoka rozwijała zawartość także). Będziesz potrzebował więcej poziomów cytowania, aby to zrobić poprawnie, ale mimo to nadal nie będzie działać, ponieważ sudo wymaga terminala (aby mógł poprosić o hasło), a ty przekierowałeś ze standardowego wejścia. Nawet używanie
ssh -t
nie pomoże tutaj.Zgadzam się również z Johanem. Nie jest jasne, czy naprawdę tego chcesz; zwróć uwagę, że przypisywanie wartości do odwołania do zmiennej powłoki jest nielegalne, więc jeśli ten plik, który próbujesz utworzyć, ma być skryptem powłoki, nie będzie działał tak, jak go opisałeś. Być może, jeśli wykonasz kopię zapasową i opisasz, co naprawdę chcesz zrobić, możemy Ci pomóc.
źródło
Escape the
$
Nie wiem, jaki jest twój przypadek użycia, ale zwykle chcesz
home_dir=$ABC
zamiast$ABC=home_dir
.źródło
=home_dir
w pliku? Oczywiście nie wiem, jaki jest przypadek użycia ...$
zostanie wysłany do zdalnej powłoki, ale wtedy ta powłoka rozszerzy się,$ABC
zanim wyświetli ciąg znakówfile
. Aby zapisać literał$
w pliku, będziesz potrzebować kolejnego (ukośnego) ukośnika odwrotnego:,echo "\\\$ABC=home_dir"
aby otrzymać zdalną powłokęecho "\$ABC=home_dir"
.Najtańszym sposobem ucieczki byłby
źródło
Zapisujesz sobie poziom cytowania, wysyłając ciąg do
cat
procesu na zdalnym końcu:Pojedyncze cudzysłowy chronią
$
lokalny koniec, a łańcuch nigdy nie jest widziany przez powłokę z drugiej strony, ponieważ jest odczytywany bezpośrednio przezcat
(viasudo
), zamiast być argumentem dla innego polecenia powłoki.Twój kod wymaga dodatkowej warstwy ucieczki, aby chronić
$
:Musisz wysłać literał
\$
do zdalnego hosta, aby zdalna powłoka zapisała literał$
do pliku. Możesz to również uprościć, cytując znacznik tutaj:źródło