Bu belgede “$” nasıl yazdırılır


43

Bash'daki burada-doc'da "$" ifadesini nasıl eko edebilirim?

Örneğin, uzak sunucudaki içeriğe sahip bir dosyaya sahip olmak istiyorum $ABC=home_dir.

$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF

Ancak değişken olarak ele alınacaktır. Bir değişmezi nasıl yazdırabilirim $?


2
tek tırnak kullanabilirsiniz
Rahul Patil

2
Bu devam eden bir çok dolaylı işlemdir. Dosyayı yerel ana bilgisayarda ve sonra scpda oluşturamayacağınıza emin misiniz ?
l0b0

Yanıtlar:


65

Burada bir doc yazmak istiyorsanız ve herhangi bir dokümanın genişletilmesini veya herhangi bir özel karakterin yorumlanmasını istemiyorsanız, etiketi şu şekilde tek tırnakla işaretleyebilirsiniz:

$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF

Bununla birlikte, örneğinizde açıklandığı gibi durumunuz çok daha karmaşık, çünkü bu içeriği ssh aracılığıyla uzak bir sisteme gönderiyorsunuz, sudo tarafından çalıştırılmak üzere bir kabuk da çağırıyorsunuz (ve böylece kabuk içeriği genişletecek yanı sıra). Bunu düzeltmek için daha fazla alıntılama seviyesine ihtiyacınız olacak, ancak bununla birlikte hala çalışmıyor çünkü sudo bir terminal gerektiriyor (böylece bir şifre isteyebilir) ve siz de stdin'den yönlendirildiniz. ssh -tBurada kullanmak bile yardımcı olmaz.

Ayrıca Johan ile aynı fikirdeyim. Bunun gerçekte istediğinin açık olmadığı belli değil; Bir kabuk değişkeni referansına değer atamanın yasal olmadığını unutmayın; bu nedenle, oluşturmaya çalıştığınız bu dosyanın kabuk betiği olması gerekiyorsa, tanımladığınız gibi çalışmaz. Belki biraz yedeklenip gerçekte ne yapmak istediğinizi açıklarsanız, daha fazla yardımcı olabiliriz.


Bu en iyi cevaptır, çünkü çok uzun BURAYA belgelere hitap edebilir. (Çoğunlukla) salak geçirmez.
Felipe Alvarez

23

Kaçış $

$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF

Ben Kullanım durumunuz nedir bilmiyorum ama genelde istediğiniz home_dir=$ABCyerine $ABC=home_dir.


2
Bu çözüm işe yarayacak, ancak OP'nin istediği gerçekten bu mu? Yürütüldüğünde, atama sol tarafı için ABC'yi seçecek ve muhtemelen =home_dirdosyaya depolamayı bitirecek bir dizgiyi "dosyaya" depolayacak bir kabuk betiği oluşturuyor gibi görünüyor. Tabii ki kullanım davasının ne olduğunu bilmiyorum ...
Johan

2
Bu, bir hazır bilginin $uzak kabuğa gönderilmesine neden olur , ancak daha sonra dizenin yankılanmasından önce bu kabuk genişler . Değişmez dosyayı dosyaya yazmak için başka bir (kaçış) ters eğik çizgi gerekir: böylece uzaktaki kabuk alır . $ABCfile$echo "\\\$ABC=home_dir"echo "\$ABC=home_dir"
chepner

9

Kaçmanın en ucuz yolu

$ ssh hostname sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF

4

Dizeyi catuzak uçtaki bir işleme göndererek kendinize bir alıntı düzeyi kaydedersiniz :

echo 'echo $ABC=home_dir' | ssh hostname sudo -s "cat > file"

Tek tırnak $yerel ucu korur ve dize hiçbir zaman diğer kabuk tarafından görülmez, çünkü başka bir kabuk komutunun argümanı olmak yerine doğrudan cat(yoluyla sudo) okunur .

Kodunuzla, aşağıdakileri korumak için fazladan bir kaçış katmanına ihtiyacınız olacaktır $:

$ ssh hostname sudo -s <<EOF
echo "\\\$ABC=home_dir" > file
EOF

\$Uzak ana bilgisayara bir hazır bilgi göndermeniz gerekir , böylece uzak kabuk $dosyaya bir hazır bilgi yazacaktır . Bunu here-doc işaretleyicisinden alıntı yaparak da basitleştirebilirsiniz:

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.