Neden yol adı genişletme böyle çalışır?


0

Bunun gibi bir dizin yapısına sahibim:

.
├── dir
   └── src
       └── file.c
├── dir_a1
   └── src
       └── file.c
└── dir_a2
    └── src
        └── file.c

Aşağıdaki komutu çalıştırdığımda sonuçlar beklendiği gibi:

echo dir{,_a[12]}/**/*.c 
#
dir/src/file.c
dir_a1/src/file.c
dir_a2/src/file.c

Ben kaldırırsanız file.c gelen dir_a2 , sonuç yine ok gibidir:

rm dir_a2/src/file.c
echo dir{,_a[12]}/**/*.c
#
dir/src/file.c
dir_a1/src/file.c

Ben kaldırmak Ama file.c gelen dir , o dizinin sonuçları berbat:

rm dir/src/file.c
echo dir{,_a[12]}/**/*.c
#
dir/**/*.c
dir_a1/src/file.c

Neden bash dir_a2 için genişleme sonucunu kaldırmaya karar verdi ama dir için değil ?

globstar kabuğunda etkindir.

Yanıtlar:


1

Ayraç genişleme (yani, {this,that,etc}) 'dir değil bu isimle bir dosya var olup olmadığını tüm değerlere genişler, yani bir dosya topak. Böylece, dir{,_a[12]}/**/*.ciki küre paternine genişler dir/**/*.cve dir_a[12]/**/*.c. İkincisi, yalnızca eşleşen dosyaya genişler dir_a1/src/file.c, ancak ilki hiçbir şeyle eşleşmez ve bu nedenle tek başına kalır (ve bu nedenle kelimenin tam anlamıyla yankılanır).

Eşleşmemiş globların arasından geçmek istemiyorsanız, nullglobkabuk seçeneğini, ile ayarlayın shopt -s nullglob. Ancak bunun ls /etc/*.nosuchextension, mevcut yönetmenin içeriğini listelemek gibi diğer şeylerin garip şekillerde hareket etmesine neden olacağını unutmayın . Eşleşmemiş globları ele almanın bir başka yolu failglobkabuk seçeneğidir.


Eğer dosyayı dir_a1'den kaldırırsam , dir ile aynı şekilde davranır . Teşekkürler, anlayamadım :)
xba

@ xba: Kesinlikle. echo "dir / ** / *. c" ve "dir_a [12] / ** / *. c" harflerini basar.
Gordon Davisson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.