Cách in ấn $ đô la trong tài liệu tại đây


42

Làm thế nào tôi có thể lặp lại "$" trong tài liệu ở đây?

Ví dụ, tôi muốn có một tệp có nội dung trên máy chủ từ xa như thế nào $ABC=home_dir.

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

Nhưng nó sẽ được coi là một biến. Làm thế nào tôi có thể in một chữ $?


2
bạn có thể sử dụng dấu ngoặc đơn
Rahul Patil

2
Đó là rất nhiều tình cảm đang diễn ra. Bạn có chắc chắn không thể tạo tệp trên máy chủ cục bộ và sau scpđó không?
l0b0

Câu trả lời:


65

Nếu bạn muốn viết tài liệu ở đây và bạn không muốn BẤT K of tài liệu nào được mở rộng hoặc bất kỳ ký tự đặc biệt nào được giải thích, bạn có thể trích dẫn nhãn bằng các trích dẫn duy nhất, như sau:

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

Tuy nhiên, tình huống của bạn như được mô tả trong ví dụ của bạn phức tạp hơn nhiều, bởi vì bạn thực sự đang gửi nội dung này thông qua ssh, đến một hệ thống từ xa, được điều hành bởi sudo cũng đang gọi shell (và do đó shell sẽ mở rộng nội dung cũng). Bạn sẽ cần nhiều mức trích dẫn hơn để có quyền này, nhưng ngay cả khi nó vẫn không hoạt động vì sudo yêu cầu thiết bị đầu cuối (vì vậy nó có thể yêu cầu mật khẩu) và bạn đã chuyển hướng từ stdin. Ngay cả việc sử dụng ssh -tsẽ không giúp đỡ ở đây.

Ngoài ra tôi đồng ý với Johan. Không rõ đây thực sự là những gì bạn muốn; lưu ý rằng việc gán giá trị cho tham chiếu biến shell là không hợp pháp, vì vậy nếu tệp này bạn đang cố tạo được coi là tập lệnh shell, nó sẽ không hoạt động như bạn đã mô tả. Có lẽ nếu bạn sao lưu một chút và mô tả những gì bạn thực sự muốn làm, chúng tôi có thể giúp nhiều hơn.


Đây là câu trả lời tốt nhất vì nó có thể phục vụ cho các tài liệu TẠI ĐÂY rất dài. Đó là (hầu hết) bằng chứng ngốc.
Felipe Alvarez

22

Thoát khỏi $

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

Tôi không biết trường hợp sử dụng của bạn là gì nhưng thường thì bạn muốn home_dir=$ABCthay vì $ABC=home_dir.


2
Giải pháp này sẽ hoạt động, nhưng đó có thực sự là những gì OP muốn? Nó xuất hiện để tạo một tập lệnh shell mà khi được thực thi sẽ lưu trữ trong "tập tin" một chuỗi sẽ hủy đăng ký ABC cho phía bên trái của nhiệm vụ và có khả năng lưu trữ =home_dirvào tập tin? Tất nhiên tôi không biết trường hợp sử dụng là gì ...
Johan

2
Điều này sẽ khiến một chữ $được gửi đến shell từ xa, nhưng sau đó shell đó sẽ mở rộng $ABCtrước khi lặp lại chuỗi file. Để viết chữ theo nghĩa đen $vào tệp, bạn sẽ cần một dấu gạch chéo ngược (đã thoát) khác: echo "\\\$ABC=home_dir"để trình điều khiển từ xa nhận được echo "\$ABC=home_dir".
chepner

9

Cách thoát rẻ nhất sẽ là

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

4

Bạn tiết kiệm cho mình một mức trích dẫn bằng cách gửi chuỗi đến một catquy trình ở đầu xa:

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

Các trích dẫn duy nhất bảo vệ $đầu cuối cục bộ và chuỗi không bao giờ được nhìn thấy bởi shell ở bên kia vì nó được đọc trực tiếp bởi cat(thông qua sudo), thay vì là một đối số cho lệnh shell khác.

Với mã của bạn, bạn sẽ cần thêm một lớp thoát để bảo vệ $:

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

Bạn cần gửi một chữ \$đến máy chủ từ xa, để shell từ xa sẽ ghi một chữ $vào tệp. Bạn cũng có thể đơn giản hóa điều này bằng cách trích dẫn điểm đánh dấu tài liệu ở đây:

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.