Saya mengerti apa itu brace expansion , tapi saya tidak tahu cara terbaik untuk menggunakannya.
Kapan Anda menggunakannya?
Tolong ajari saya beberapa contoh yang nyaman dan luar biasa jika Anda memiliki tip Anda sendiri.
Saya mengerti apa itu brace expansion , tapi saya tidak tahu cara terbaik untuk menggunakannya.
Kapan Anda menggunakannya?
Tolong ajari saya beberapa contoh yang nyaman dan luar biasa jika Anda memiliki tip Anda sendiri.
Jawaban:
Perluasan brace sangat berguna jika Anda memiliki nama jalur yang panjang. Saya menggunakannya sebagai cara cepat untuk membuat cadangan file :
cp /a/really/long/path/to/some/file.txt{,.bak}
akan menyalin /a/really/long/path/to/some/file.txt
ke/a/really/long/path/to/some/file.txt.bak
Anda juga dapat menggunakannya secara berurutan . Saya pernah melakukannya untuk mengunduh banyak halaman dari web:
wget http://domain.com/book/page{1..5}.html
atau
for i in {1..100}
do
#do something 100 times
done
program
mendapat tiga kata: "-f file1" "-f file2" "-f file3"
, bukan 6: "-f" "file1" "-f" "file2" "-f" "file3"
.
for
lingkaran agak tidak ada gunanya, karena Anda dapat menulis for ((i=1; i<=100; i++))
dan lebih efisien.
Ekspansi Brace sangat berguna saat membuat struktur direktori besar:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Ini akan memberimu
find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2
Anda bahkan bisa melangkah lebih jauh dan memasukkan ekspansi brace ke ekspansi brace:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Ini akan memberi Anda struktur direktori yang sama dengan contoh di atas.
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) sebenarnya tidak melayani tujuan apa pun. Anda bisa saja melakukan ini: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
.
subdir1
dan subdir2
dalam arti non-literal. Ganti subdir1
dengan cat
dan subdir2
dengan dog
misalnya.
Saya menggunakannya untuk membandingkan hasil tes aktual dengan hasil tes yang diinginkan selama pengembangan. Jika tes # 41 gagal, mudah untuk melihat apa perbedaan antara output tes (dalam file tests.output / 041) dan output yang diinginkan (dalam file tests.out / 041):
$ diff tests.{out,output}/041
Beberapa kasus yang sering saya alami adalah:
Untuk mengganti nama:
mv myText.{txt,tex}
atau
mv myText.tex{,.old}
atau
cp myText.tex{,.backup}
(Meskipun kurang berantakan untuk menggunakan kontrol versi untuk 2 tugas terakhir.)
Untuk membandingkan (sudah disebutkan):
diff path{1,2}/a.txt
Ada beberapa jawaban yang bagus di sini, tetapi tidak ada yang menyebutkan kapan tidak menggunakan ekspansi brace. Seperti penjawab lainnya, saya menggunakan sedikit penjepit pada baris perintah. Saya juga menggunakannya di alias dan fungsi saya karena saya dapat mengharapkan shell cerdas.
Saya tidak menggunakannya dalam skrip shell saya (kecuali ada beberapa alasan mengapa skrip harus bash atau zsh, meskipun dalam kasus tersebut, yang terbaik adalah meng-upgrade ke bahasa skrip "nyata" seperti perl
atau python
). Ekspansi Brace tidak portabel karena tidak dalam standar shell POSIX. Bahkan jika bekerja di Anda /bin/sh
- shebang skrip ed shell, itu tidak akan bekerja pada sistem dengan lebih dilucuti /bin/sh
kerang (misalnya dash
).
Dalam hal perbedaan satu digit, Anda tidak perlu ekspansi penjepit; kelas karakter sudah cukup:
Bashism:
diff file{1,2}
Portabel:
diff file[12]
file{1,2}
akan selalu diperluas ke file1 file2
, sementara file[12]
hanya memperluas ke nama file yang ada: yaitu jika file1
ada tetapi file2
tidak, file[12]
diperluas menjadi file1
hanya. The []
ekspansi benar-benar versi terbatas dari ?
ekspansi (dan mereka disebut "ekspansi pathname").
program -f file1 -f file2 -f file3
, Anda bisa melakukannyaprogram "-f file"{1..3}