Perbedaan antara {1,2,3} dan {1.,3}


17

Apakah ada perbedaan antara urutan {1,2,3}dan {1..3}?

Contohnya jika saya punya beberapa file

file.1
file.2
file.3

dan saya ingin catmereka bersama-sama apakah aman untuk digunakan cat file.{1..3} > file?

Yang saya tahu adalah bahwa cat file.*>filehal itu dapat menyebabkan masalah karena shell dapat memperluas file secara acak kadang-kadang (saya pikir ini tergantung pada inode, bukan?)


1
gunakancat file.[123] >file
mikeserv

3
Urutan ekspansi file.*tidak tergantung pada inode. Itu selalu mengurutkan mereka secara leksikografis, yang dapat bergantung pada pengaturan lokasi Anda.
Barmar

1
"tergantung pada inode" terdengar seperti fase dari salah satu adegan "komputer" kriminal yang diteliti dengan lebih baik.
Alec Teal

1
@ mikeserv, saya yakin saya mendapatkannya — ini adalah shell glob, jadi itu hanya mengembang ke file yang benar-benar ada, bukan? Vs. file.{1..3}yang berkembang ke ketiga apakah mereka ada atau tidak.
Wildcard

1
@ Kartu Memori - benar, selama setidaknya ada, yaitu. Jika tidak, itu tidak mengembang sama sekali dan catkesalahan dengan file.[123] not foundatau sesuatu yang sangat berguna.
mikeserv

Jawaban:


18

{1..3}dan {1,2,3}menghasilkan hasil yang sama, tetapi dengan cara yang berbeda.

Secara umum, {n1..n2}(yang datang pertama dari zsh, bashdan kshmenyalinnya nanti) di mana n1dan n2bilangan bulat menghasilkan semua angka antara n1dan n2. Sambil {x,y,z}menghasilkan tiga karakter x, ydan z.

Dalam kasus Anda, Anda aman digunakan cat file.{1..3} > file

Sekarang, dalam kasus cat file.*>file, Anda menggunakan shell globbing , yang menghasilkan semua nama file dimulai dengan file.dan hasilnya akan diurutkan berdasarkan urutan susunan di lokal saat ini.

Anda masih aman, tetapi tidak lagi ketika Anda memiliki lebih dari 10 file. {1..10}akan memberimu 1 2 3 4 5 6 7 8 9 10. Saat dengan globbing, Anda akan mendapatkannya1 10 2 3 4 5 6 7 8 9


8

Perbedaannya adalah bahwa yang satu adalah daftar dan yang lainnya adalah urutan. {1,2,3}mengembang untuk tiga elemen tertentu, 1, 2, dan 3. {1..3}memperluas ke daftar nomor antara satu dan tiga. Dalam kasus khusus ini, keduanya sama dan Anda dapat menggunakan salah satu dari keduanya. file.*akan diperluas ke semua file dan direktori di direktori saat ini yang namanya dimulai dengan file.. Jika Anda hanya memiliki file.1, file.2dan file.3kemudian itu juga setara dengan dua lainnya.

Adapun masalah yang menyebabkannya, saya tidak mengerti mengapa. Anda mungkin berpikir

$ cat file.* > file.txt
cat: file.txt: input file is output file

Namun, itu adalah masalah yang sama sekali berbeda. Satu-satunya masalah lain yang bisa saya pikirkan adalah bahwa shell Anda mungkin tidak mencantumkan file dalam urutan yang benar. Sebagai contoh:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

Untuk mengatasinya, Anda dapat menggunakan zshalih-alih bash(lihat di sini untuk detail):

% echo f*(n)
file1 file2 file11

Secara umum, ketiga pendekatan itu tidak sama. Itu tergantung pada apa yang ingin Anda lakukan. Dalam kasus di mana ketiganya mengembalikan output yang sama, ya, Anda dapat menggunakan salah satu dari mereka. Tidak ada bedanya. Semua ekspansi ini dilakukan oleh shell dan terjadi sebelum mereka diteruskan ke perintah apa pun yang menggunakannya.


tidak akan ada masalah dengan *jika saya memiliki lebih dari 10 file, jika saya bergantung pada urutan yang benar?
syss

1
@syss no. Akan menjadi masalah jika Anda memiliki lebih dari ARG_MAXfile tetapi itu akan menjadi cara, cara lebih dari 10.
terdon

1
@terdon Dia bertanya apakah mereka akan muncul dalam urutan numerik (yaitu bukan "1, 10, 2"), tidak apakah mereka akan membanjiri array argumen.
Random832

3
@terdon Saya pikir @syss benar bahwa output cat *tidak didefinisikan dengan baik. Outputnya tergantung pada shell dan lingkungannya. Lihat komentar Sebastian .
Marco

Tidak akan menambahkan .txtmenyelesaikan masalah dengan file.*?
Ismael Miguel

6

Mereka sama, tetapi itu tergantung pada versi bash yang telah Anda instal jika tersedia.

Dari halaman ini :

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.