Pertanyaan Menggunakan perintah cd untuk menavigasi direktori di Ubuntu yang memiliki karakter khusus [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Ketika saya ingin menavigasi ke direktori yang memiliki karakter khusus dalam nama mereka, saya mendapatkan pesan kesalahan.

Sebagai contoh:

aman@desktop:~/Aman$ cd !)e$!gn&(reate
bash: !: event not found
aman@desktop:~/Aman$ 

Sini !)e$!gn&(reate adalah nama direktori tempat saya ingin menavigasi.

Bagaimana memperbaiki kesalahan ini?

Bagaimana cara menggunakan cd perintah untuk menavigasi direktori di Ubuntu memiliki nama direktori dengan karakter khusus?


12
2018-04-23 15:53


asal


Anda dapat mematikan ekspansi histori: set +H - hidupkan kembali dengan set -H - glenn jackman


Jawaban:


Kesalahan itu terjadi karena ! (Bang) adalah pintasan yang memungkinkan Anda menjalankan kembali perintah dari riwayat Anda. Ex: Perintah ini menjalankan ulang perintah # 1504 dari riwayatku.

$ !1504

Untuk menghindari masalah itu, coba enkapsulasi nama direktori Anda dengan tanda kutip tunggal.

$ cd '!)e$!gn&(reate'

Yang sedang berkata, sementara Ubuntu (Linux) akan membiarkan Anda nama direktori dengan cara ini, saya sangat menyarankan untuk tidak melakukannya. Menggunakan karakter khusus dalam nama direktori dapat membuat mereka sulit untuk dibaca, dan jika Anda menggunakan karakter yang dilindungi undang-undang Anda akan selalu perlu untuk melarikan diri atau merangkum nama direktori dalam tanda kutip.


19
2018-04-23 16:00



+1 terutama untuk paragraf terakhir ... dan jika mereka dapat menghindari ruang juga, akan berterima kasih di masa depan. Hanya MHO. - Rmano
@Rmano Ya, aku bersamamu tentang itu. Spasi di direktori / nama file membuat saya gila. - Aaron
set +H atau set +o histexpand untuk menonaktifkan perlakuan khusus !. Tambahkan itu ke Anda ~/.bash_profile atau bahkan beberapa file konfigurasi di seluruh sistem dan Anda akan memiliki satu hal yang perlu dikhawatirkan. Kecuali Anda benar-benar menggunakan fitur ini, itu. - MvG
Saya tidak yakin apa ini disebut, tapi saya menyebutnya "melewati nama file sebagai string" karena itulah yang akan disebut dalam pemrograman. - JFA


Kau gunakan \ sebelum karakter khusus

cd \!\)e\$\!gn\&\(reate

Anda juga dapat menempatkan seluruh foldname dalam tanda kutip tunggal

cd '!)e$!gn&(reate'

Anda dapat merangkum seluruh jalur dalam tanda kutip tunggal

cd 'Desktop/!)e$!gn&(reate'

jika Anda ingin merujuk path di dalam direktori / home / username: cukup tambahkan ~/ sebelum jalan dalam tanda kutip tunggal

cd ~/'Desktop/!)e$!gn&(reate'

10
2018-04-23 16:00





Secara interaktif, ketik cd ! lalu tekan Tab dan bash akan mengisi sisanya, dengan benar lolos.


5
2018-04-23 17:00



Akankah itu berfungsi bahkan jika karakter pertama adalah karakter khusus, atau Anda harus mengetik cd \! kemudian TAB? - IQAndreas
bekerja untuk saya tanpa melarikan diri. - glenn jackman


Tidak yakin apakah ini berlaku untuk karakter khusus, tetapi mungkin menempatkan jalur di dalam tanda kutip ganda?


2
2018-04-23 17:29



Tanda kutip ganda akan membantu dengan karakter khusus seperti spasi yang tidak diinterpolasi, tetapi tidak akan membantu dengan $,! dan sejenisnya, yang diinterpolasi. Ada dua jenis string dalam bash: tanda kutip ganda, yang memungkinkan untuk interpolasi, dan tanda kutip tunggal, yang tidak. (Inilah sebabnya mengapa Anda harus selalu menempatkan regex Anda grep, sed, dll. dalam tanda kutip tunggal.) - Livius


Jawaban Confirmming @glenn jackman bekerja dalam praktik, saya mengetik cd ! dan kemudian menekan [tab]

ianh@abe:~/tmp$ mkdir '!)e$!gn&(reate' ianh@abe:~/tmp$ cd \!\)e\$\!gn\&\(reate/ ianh@abe:~/tmp/!)e$!gn&(reate$

Bahkan membuat direktori dengan '! 1997' dan mengetik cd !1 dan kemudian menekan [tab] berhasil.

ianh@abe:~/tmp/!)e$!gn&(reate$ mkdir '!1997' ianh@abe:~/tmp/!)e$!gn&(reate$ cd \!1997/ ianh@abe:.../!)e$!gn&(reate/!1997$

(saya tidak punya cukup poin untuk menambahkannya sebagai komentar)


2
2018-04-24 06:03