Bagaimana seseorang lolos dari "` "(aksen kubur / backtick) di jalan?

12

Saya cenderung untuk awalan file dan folder yang sering digunakan dengan karakter "aksen kuburan" (tilde non-shift, tanda centang-kembali, atau aksen lama-biasa, yang Anda inginkan ..), karena mudah didapat, dan biarkan saya mengurutkan hal-hal berdasarkan abjad, sementara membiarkan saya memilih untuk menunjukkan beberapa item di atas. Ini berfungsi dengan baik, kecuali ketika saya mengakses file-file ini melalui CLI atau SSH / SCP.

Jika saya mencoba menjalankan perintah, memanggil file itu tidak terhapus ↝ itu menendang saya ke sesi interaktif .. misalnya ↯

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

Namun jika saya mencoba solusi logis ↯

# 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

Saya tahu aturan "baru" adalah menggunakan sintaksis seperti export NOW=$(date)vs export NOW= `date` (pada kenyataannya, saya punya waktu bahkan menulis yang terakhir dalam sintaks SE MD ...) tetapi ini tidak terkait dengan ENVatau skrip apa pun. ..

Catatan: Ini adalah lingkungan Mac OS X, tetapi yang mengatakan, GUI tidak pernah memiliki masalah berurusan dengan karakter ini setiap hari, dan biasanya, jika akan ada masalah sintaksis di Terminal, Apple melakukan pekerjaan yang cukup baik untuk menonaktifkan perilaku di GUI ... Tidak yakin apakah ini bug, atau jika teknik untuk berurusan dengan jalur seperti itu tidak jelas .. tetapi sejauh ini, saya belum dapat menemukan cara "untuk menghindarinya" ?

mralexgray
sumber
mengapa tidak hanya menggunakan karakter yang tidak perlu melarikan diri seperti nomor 1?
JamesRyan
backtick adalah - secara visual - kurang mengganggu (bagi saya), dan memiliki bagasi semantik yang kurang melekat ketika re-bertujuan itu sebagai pembatas semacam.
mralexgray

Jawaban:

10

Anda dapat menggunakan 3 garis miring terbalik seperti yang disebutkan oleh Jed Daniels atau Anda dapat membungkusnya dengan tanda kutip tunggal (')dan menggunakan garis miring terbalik tunggal.

Contoh keduanya ada di bawah ini.

$ 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     
$
Rik Schneider
sumber
luar biasa. Saya kira saya akan memilih jawaban ini karena senang memiliki dua cara untuk melakukannya. baik cara Anda juga dapat menggunakan teknik ini secara lokal, hanya menggunakan satu garis miring, atau untuk garis miring, TIDAK ADA SLASH dan hanya teknik kutipan tunggal di sekitar file atau direktori yang bermasalah .. terima kasih!
mralexgray
5

Tiga backslash harus melakukannya:

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

Backslash pertama lolos dari backtick sehingga dikirim ke sisi lain, tetapi sisi lain melempar kesalahan karena mengharapkan backtick berpasangan. Backslash kedua lolos dari backslash pertama, maka Anda memerlukan dua backslash tambahan sehingga Anda dapat mengirim backslash yang lolos ke sisi lain.

EDIT: Seperti yang disebutkan Rik, Anda juga dapat melakukannya dengan satu kutipan. Saya tidak memikirkan hal ini karena Anda tidak dapat menggunakannya dengan variabel (mereka tidak akan diperluas pada sistem lokal ketika dalam tanda kutip tunggal).

Jed Daniels
sumber
3

Biasanya, perintah baris ditafsirkan oleh shell sekali. Namun, karena alasan historis, scp meneruskan nama file ke shell jauh juga, sehingga nama file akan ditafsirkan oleh shell dua kali . Ini juga yang membuat hal-hal seperti scp remote:'/path/prefix*' /path/local/bekerja, shell jarak jauh berkembang /path/prefix*.

Cara termudah untuk menghindari ekspansi kedua adalah menggunakan sftp, yang tidak menggunakan shell jarak jauh. Itu masih melakukan ekspansi glob, tetapi karena Anda dapat memberikan perintah pada stdin, Anda dapat menghindari ekspansi shell lokal Anda sepenuhnya.

Selain itu, Anda dapat menggunakan salah satu mekanisme kutipan shell normal, termasuk yang diberikan oleh @ Dani Daniels dan @Rik Schneider, tetapi saya ingin menjelaskan apa yang sebenarnya terjadi dan menyebutkan sftp.

(Anda dapat menggunakan semua jenis fitur shell di nama file scp Anda, misalnya scp server:\$HOME/file destakan menggunakan ide shell remote$HOME , sedangkan jika Anda mengeluarkannya \, ia akan menggunakan shell lokal Anda .).

derobert
sumber