arti "'" (apostrof) dalam perintah terminal

11

Untuk beberapa alasan aneh, saya mencoba "'" sebagai pemisah kata dalam pengidentifikasi, seperti pada:

$ export foo'bar=1
> 
> ^C
$ 

Hasilnya adalah seperti yang ditunjukkan di atas, id perubahan prompt untuk ">" dan sistem jelas menunggu informasi lebih lanjut di bagian saya. Seperti yang Anda lihat, saya harus ctrl-C untuk melarikan diri. Hal yang sama terjadi dengan menggunakan perintah lain seperti

$ ls foo'bar
$ mkdir foo'bar

Saya ingin tahu tentang arti semua ini, itulah makna khusus yang dimiliki "" pada perintah terminal (begitu spesialnya sehingga terpisah bahkan di dalam id).

Tambahan: Selain itu saya juga ingin mengetahui sekumpulan karakter khusus atau tidak valid dalam nama file dan folder, baik di bawah Unix-like dan sistem Windows (untuk mendapatkan subset umum yang aman) (khususnya, bagaimana dengan semua non-ASCII?).

Terima kasih, Denis

denis 63
sumber
Di dunia Linux, semua karakter kecuali untuk \ 0 (nol) dan / diizinkan. Namun, itu tidak berarti mereka semua disarankan. Banyak orang menganggap itu terbaik untuk menghindari karakter yang memiliki makna khusus untuk shell. Jika Anda ingin tahu tentang Windows, lihat referensi Windows.
Scott Severance

Jawaban:

15

Karakter 'adalah karakter yang sangat kuat setiap kali digunakan dalam perintah shell. Pada dasarnya '(tanda apostrof) menonaktifkan semua jenis transformasi atau modifikasi. Itu akan mempertimbangkan apa pun yang tertutup dengan tanda 'sebagai entitas tunggal yaitu parameter tunggal. Sama sekali tidak ada substitusi atau ekspansi yang akan terjadi.

Contoh:

 $ echo '$HOME'

akan menghasilkan pada output string $HOMEitu sendiri dan tidak akan mencetak path ke direktori home Anda. Karena tanda kutip tunggal mencegah segala jenis ekspansi, substitusi dan pertimbangan sederhana menganggap apa pun yang akan hadir sebagai parameter sederhana.

Jika Anda ingin menggunakan tanda kutip seperti apa adanya, Anda harus menghindarinya:

 $ mkdir foo\'bar

 $ cd foo\'bar

Jika tidak lolos, itu akan menunggu pasangannya ditutup, seperti yang terjadi pada contoh pertama Anda.

Jadi, dikoreksi, perintah Anda adalah:

 $ export foo\'bar=1

CATATAN: Seperti yang dicatat Milan Todorovic, ini tidak akan berlaku, karena Anda tidak dapat menggunakan tanda kutip dalam hal ini.

Frantique
sumber
1
@ denis63 tolong terima jawabannya jika Anda ingin melihatnya :)
Rinzwind
7

Karakter 'adalah karakter khusus. Anda menggunakannya untuk menandai bagian dari entri baris perintah yang tidak akan diubah (mis. Tidak ada penggantian untuk wildcard). Sebagai contoh:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Ini berarti bahwa argumen untuk lsadalah bla*dan bukan semua yang dimulai dengan bla.

Alasan mengapa Anda mendapatkan >karakter adalah karena Anda harus menggunakan satu 'untuk membuka dan satu 'untuk menutup bagian yang tidak akan diubah.

Jika Anda ingin menggunakan 'dalam nama folder Anda harus melarikan diri seperti ini: \'. Jadi, jika Anda ingin daftar folder bernama foo'barAnda harus mengetik ls foo\'bar.

Oh, dan saya tidak yakin apakah mungkin untuk menggunakan 'nama variabel lingkungan. Saya pikir Anda tidak dapat menggunakan export foo\'bar=1,

Semoga ini membantu.

Milan Todorovic
sumber
Suara positif untuk pengamatan Anda tentang pembatasan nama variabel lingkungan.
Frantique
Belum dapat melakukan upvote (baru di askubuntu), tetapi perasaan itu ada. Diperiksa tentang nama env var, hanya seperti yang Anda katakan. (Saya merasa agak bodoh untuk tidak berpikir membuka / menutup pembatas sendiri, tapi kemudian saya menganggap "'" sebagai tanda kutip nyata, bukan kutipan tunggal). Denis
denis 63