GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan antara '{}' dan {} dalam perintah find?

Untuk bash kulit, '{}' dan {} dapat dipertukarkan. Ini tidak terjadi pada semua shell (seperti fish ).

Menempatkan argumen dalam tanda kutip tunggal secara eksplisit menunjukkan bahwa kurung kurawal harus dikirim ke find . Bergantung pada penggunaannya, bash shell terkadang mengganti konten kurung kurawal.

Seperti yang terlihat di bawah, bash tidak mengganti tanda kurung kosong, dan mereka diteruskan ke perintah. Untuk find perintah, tidak masalah.

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

$ echo '{1,3}'
{1,3}

Untuk sebagian besar pengguna (terutama yang menggunakan cangkang POSIX), tidak ada perbedaan.

Menurut bagian Contoh halaman manual untuk GNU find :

Perhatikan bahwa tanda kurung diapit dengan tanda kutip tunggal untuk melindunginya dari interpretasi sebagai tanda baca skrip shell.

Saya pikir penulis halaman manual GNU melakukan kesalahan karena berhati-hati, tetapi saya perhatikan bahwa tidak semua contoh di halaman manual mereka mengutip tanda kurung. Contoh-contoh ini dari dokumentasi resmi GNU find juga menghilangkan kutipan.

Dalam contoh dari Spesifikasi POSIX / UNIX Tunggal, tanda kurung tidak dikutip bila digunakan dengan -exec opsi.

Dengan shell POSIX, perluasan parameter hanya terjadi jika ada parameter khusus yang diapit di dalam tanda kurung – tetapi tidak dengan tanda kurung kosong .

Shell Bash menyertakan ekspansi brace sebagai fitur (non-portabel), tetapi pola seperti itu hanya diperluas ketika koma atau titik disertakan di dalam kurung . Bash juga menggunakan kurung kurawal untuk pengelompokan perintah, tetapi ini tidak terjadi kecuali benar-benar ada sekelompok perintah di dalam penjepit.

Akhirnya, saya mencoba menjalankan find -exec ls -l {} \; di sh , dash dan tcsh tetapi tidak satu pun dari cangkang ini yang memperluas {} ke dalam hal lain. Seperti yang telah ditunjukkan orang lain, fish shell memperlakukan {} khususnya tetapi ini bukan shell POSIX (yang dianggap sebagai keuntungan oleh pembuat dan penggunanya). Tidak ada salahnya mengutip kawat gigi tetapi juru ketik malas yang tidak menggunakan kulit ikan tidak perlu merasa bersalah karena mengabaikannya.


Dengan hampir semua penerjemah shell tersedia, sama sekali tidak ada perbedaan antara '{}' dan {} .

Tanda kutip tunggal biasanya digunakan untuk melindungi string yang disematkan agar tidak diganti dengan sesuatu yang lain, misalnya:

  • 'a b' adalah parameter tiga karakter tunggal, tanpa tanda kutip itu akan menjadi parameter dua karakter tunggal
  • '$b' secara harfiah adalah tanda dolar diikuti oleh huruf b, tanpa tanda kutip yang akan menjadi isi variabel b apa pun dan mungkin tidak ada apa-apanya jika tidak disetel
  • '!!' adalah tanda seru literal saat tidak dikutip dan dengan beberapa shell interaktif, mereka akan diperluas ke perintah terakhir yang dimasukkan ke dalam sejarah
  • '*' adalah tanda bintang literal, tanda kutip akan diganti dengan daftar nama file yang tidak tersembunyi di direktori saat ini.

Baik sebagai standar POSIX maupun shell utama (sh (Bourne), ksh , bash , ash , dash , zsh , csh , tcsh ) perluas {} untuk hal lain, tanda kutip tidak diperlukan.

Namun, ada sebuah shell eksotis bernama fish , yang kebetulan memperluas {} sebagai string kosong, misalnya:

> ps -p %self
  PID TTY          TIME CMD
 5247 pts/1    00:00:00 fish
> echo a {} b '{}'
a  b {}

Itu mungkin alasan mengapa GNU find dokumentasi menyarankan untuk melindungi {} terhadap interpretasi dengan tanda kutip atau garis miring terbalik.


Linux
  1. Perbedaan Antara Shell Login dan Shell Non-login?

  2. Perbedaan Antara ' Dan ” Di Command Line (bash)??

  3. Perbedaan Penggunaan Antara Variabel Shell Dan Variabel Lingkungan?

  1. Perbedaan Antara Eot dan Eof?

  2. Perbedaan Antara [0-9], [[:digit:]] Dan D?

  3. Perbedaan Antara Snat dan Masquerade?

  1. Apa perbedaan antara nohup dan ampersand

  2. Apa perbedaan antara &> dan >&di bash?

  3. Perbedaan antara 'man ls' dan 'ls --help'?