Saya memiliki shell / terminal berbasis browser yang mengeksekusi perintah bash dan saya keluar dari spasi tetapi ternyata tanda kurung juga harus diloloskan. Apa karakter lain yang perlu diloloskan untuk nama file yang tidak ada dalam tanda kutip?
12
mv filename filename-foo
dalam bash, karakter mana yang harus saya hindari, selain spasi dan tanda kurung?mv "$filename" "$newname"
.Jawaban:
Solusi sederhana adalah dengan menempatkan tanda kutip tunggal (
'
) di awal dan tanda kutip tunggal lainnya di akhir, dan mengganti setiap'
karakter di dalam nama file dengan urutan 4 karakter'\''
. Semua karakter kehilangan makna khusus mereka di dalam string yang dikutip tunggal, kecuali'
dirinya sendiri yang menandai akhir string. Urutan'\''
mengakhiri literal yang dikutip tunggal, segera diikuti oleh kutipan tunggal yang dikutip, dan membuka literal yang dikutip tunggal. Demikian nama filenyadapat dikutip sebagai berikut:
Kutipan ganda memiliki aturan pelolosan yang lebih kompleks dan tidak memungkinkan Anda untuk menyertakan tanda seru
!
jika penggantian riwayat diaktifkan, jadi saya tidak akan mempertimbangkannya lebih lanjut.Pendekatan alternatif adalah melindungi karakter dengan garis miring terbalik. Ini berfungsi untuk setiap karakter kecuali baris baru; untuk baris baru, memasukkannya ke dalam tanda kutip tunggal (atau tanda kutip ganda) adalah satu-satunya solusi. Jika Anda ingin meminimalkan jumlah garis miring terbalik untuk menyajikan nama yang dikutip kepada pengguna, Anda dapat membatasi itu ke tempat-tempat di mana garis miring terbalik diperlukan; namun, semakin banyak backslash yang Anda hilangkan, semakin Anda berisiko melupakan yang dibutuhkan. Huruf, digit, dan karakter non-ASCII selalu ok¹. Kutip spasi putih dan tanda baca setiap kali Anda tidak yakin.
Dengan shell yang khas (ksh, bash atau zsh), Anda perlu mengutip karakter berikut setidaknya dalam beberapa keadaan.
!
- ekspansi sejarah."
- sintaks shell.#
- komentar mulai ketika didahului oleh whitespace; zsh wildcard.$
- sintaks shell.&
- sintaks shell.'
- sintaks shell.(
- bahkan di tengah kata: ksh extended glob (juga tersedia dalam bash dan zsh); zsh wildcard.)
(lihat(
)*
- sh wildcard.,
- hanya di dalam ekspansi brace.;
- sintaks shell.<
- sintaks shell.=
- di zsh, ketika itu di awal nama file (ekspansi nama file dengan pencarian PATH).>
- sintaks shell.?
- sh wildcard.[
- sh wildcard.\
- sintaks shell.]
- Anda bisa lolos tanpa tanda kutip.^
- ekspansi sejarah; zsh wildcard.`
- sintaks shell.{
- ekspansi brace.|
- sintaks shell.}
- perlu melarikan diri di zsh, shell lain lebih lunak ketika tidak ada brace pembuka yang cocok.~
- Ekspansi direktori home ketika itu di awal nama file; zsh wildcard; selalu aman saat itu adalah karakter terakhir.Beberapa karakter lagi terkadang memerlukan penanganan khusus:
-
tidak khusus untuk shell, tetapi ketika itu di awal argumen perintah, itu menunjukkan opsi. Itu tidak dapat dilindungi dengan tanda kutip karena penanganan khusus ada di perintah, bukan di shell. Untuk melindungi nama file yang dimulai dengan-
, Anda bisa meletakkannya./
sebelum ini - dengan cara ini masih file yang sama, tetapi argumen tidak dimulai dengan-
lagi..
itu sendiri tidak istimewa, tetapi file dot dikecualikan dari*
gumpalan secara default.:
tidak khusus untuk shell, tetapi beberapa perintah menguraikannya secara khusus, misalnya untuk menunjukkan file jarak jauh (hostname:filename
). Konsultasikan dokumentasi perintah untuk melihat bagaimana cara mengatasi file nams yang berisi titik dua.¹ Kecuali jika pengguna telah mengkonfigurasi karakter ekspansi sejarah alternatif. Beberapa kerang memungkinkan ini. Ini adalah alasan lain untuk menggunakan tanda kutip tunggal daripada backslash.
sumber
LF
hanya, dapat dikutip dengan garis miring terbalik di beberapa shell.