Làm thế nào để một người thoát khỏi `` (trọng âm / backtick) trong một con đường?


12

Tôi có xu hướng tiền tố các tập tin và thư mục được sử dụng với ký tự "trọng âm" (dấu ngã không dịch chuyển, dấu kiểm ngược hoặc dấu cũ đơn giản, whathaveyou ..), vì nó rất dễ để truy cập và hãy để tôi sắp xếp mọi thứ theo thứ tự abc, trong khi để tôi chọn hiển thị một vài mục trên đầu trang. Nó hoạt động độc đáo, ngoại trừ khi tôi truy cập các tệp này thông qua CLI hoặc SSH / SCP.

Nếu tôi cố chạy một lệnh, gọi tệp không được giải quyết nó sẽ đưa tôi vào một phiên tương tác .. ví dụ

# scp -r dns.local:/`Downloads/CrazyRussianCars/ ~/
↩
>

Tuy nhiên, nếu tôi thử giải pháp hợp lý

# scp -r dns.local:/\`Downloads/CrazyRussianCars/ ~/
↩
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

Tôi biết quy tắc "mới" là sử dụng một cú pháp như export NOW=$(date)vs export NOW= `date` (thực tế, tôi đã có một khoảng thời gian thậm chí viết sau này bằng cú pháp SE MD ...) nhưng điều này không liên quan đến ENVhoặc bất kỳ tập lệnh nào. ..

Lưu ý: Đây môi trường Mac OS X, nhưng cho biết, GUI chưa bao giờ gặp sự cố khi xử lý ký tự này hàng ngày và thông thường, nếu có sự cố cú pháp trong Terminal, Apple thực hiện một công việc khá tốt là vô hiệu hóa hành vi trong GUI ... Không chắc đây có phải là lỗi không, hoặc nếu kỹ thuật xử lý các đường dẫn như vậy chỉ đơn giản là tối nghĩa .. nhưng cho đến nay, tôi vẫn không thể tìm thấy cách "để thoát khỏi nó" ?


Tại sao không sử dụng một nhân vật không cần thoát như số 1?
JamesRyan

backtick là - trực quan - ít gây rối (đối với tôi) và có ít hành lý ngữ nghĩa vốn có khi tái sử dụng nó như một dấu phân cách sắp xếp.
mralexgray

Câu trả lời:


10

Bạn có thể sử dụng 3 dấu gạch chéo ngược như được đề cập bởi Jed Daniels hoặc bạn có thể gói nó trong dấu ngoặc đơn (')và sử dụng dấu gạch chéo ngược đơn.

Ví dụ về cả hai bên dưới.

$ touch dir/'`rik' 
$ ls -l dir
total 1865376
-rw-r--r--  1 rik  staff          0 Jul  1 09:51 `rik 
$ scp localhost:dir/\\\`rik ./ `rik         
100%    0     0.0KB/s   00:00     
$ scp localhost:dir/'\`rik' ./ `rik     
100%    0     0.0KB/s   00:00     
$

tuyệt vời. Tôi đoán tôi sẽ chọn câu trả lời này vì thật tuyệt khi có hai cách để làm điều đó. dù bằng cách nào bạn cũng có thể sử dụng kỹ thuật này cục bộ, chỉ sử dụng một dấu gạch chéo hoặc cho dấu gạch chéo, KHÔNG RÚT và chỉ đơn giản là kỹ thuật trích dẫn đơn xung quanh tệp hoặc thư mục có vấn đề .. cảm ơn!
mralexgray

5

Ba dấu gạch chéo ngược nên làm điều đó:

jed@jed-osx:~$ ls -la \`foo
ls: `foo: No such file or directory
jed@jed-osx:~$ scp desk:\\\`foo .
`foo                                            100%    0     0.0KB/s   00:00    
jed@jed-osx:~$ ls -la \`foo
-rw-r--r--  1 jed  staff  0 Jul  1 09:45 `foo
jed@jed-osx:~$ rm \`foo

Dấu gạch chéo ngược đầu tiên thoát khỏi backtick để nó được gửi sang phía bên kia, nhưng phía bên kia lại đưa ra lỗi vì nó hy vọng backticks sẽ thành cặp. Dấu gạch chéo thứ hai thoát khỏi dấu gạch chéo ngược đầu tiên, sau đó bạn cần thêm hai dấu gạch chéo ngược để bạn có thể gửi dấu gạch chéo ngược thoát sang phía bên kia.

EDIT: Như Rik đề cập, bạn cũng có thể làm điều đó với một trích dẫn duy nhất. Tôi đã không nghĩ về điều này bởi vì bạn không thể sử dụng nó với các biến (chúng sẽ không được mở rộng trên hệ thống cục bộ khi trong các trích dẫn đơn).


3

Thông thường, các dòng lệnh được giải thích bởi shell một lần. Tuy nhiên, vì lý do lịch sử, scp cũng chuyển tên tệp vào shell từ xa, vì vậy tên tệp được giải thích bằng shell hai lần . Đây cũng là điều làm cho mọi thứ như scp remote:'/path/prefix*' /path/local/công việc, vỏ từ xa được mở rộng /path/prefix*.

Cách dễ nhất để tránh sự mở rộng thứ hai là sử dụng sftp, không sử dụng shell từ xa. Nó vẫn mở rộng toàn cầu, nhưng vì bạn có thể ra lệnh cho stdin, nên bạn có thể tránh hoàn toàn việc mở rộng trình bao cục bộ.

Ngoài ra, bạn có thể sử dụng bất kỳ cơ chế trích dẫn shell thông thường nào, bao gồm cả các cơ chế được đưa ra bởi @Jed Daniels và @Rik Schneider, nhưng tôi muốn giải thích những gì thực sự xảy ra và đề cập đến sftp.

(Bạn có thể sử dụng tất cả các loại tính năng hệ vỏ trong tên tệp scp của mình, ví dụ: scp server:\$HOME/file destsẽ sử dụng ý tưởng của trình điều khiển từ xa$HOME , trong khi nếu bạn lấy ra \, nó sẽ sử dụng trình bao cục bộ của bạn .).

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.