{} İçine alan parantezleri komutlara ve seçeneklerine bağımsız değişken olarak kullanma


11

Örnekler

Son zamanlarda {}, komutları ve hatta seçeneklerini argüman olarak, açılış ve kapanış parantezleri arasında hiçbir şey olmadan , kapalı parantez çiftlerini kullanarak örnekler buldum :

cat foo | xargs -I{} echo {}

find . -size 0 -exec rm -i {} \;

Belge Yok

Benim sorunum, GNU Bash El Kitabı'nda{} yukarıdaki örneklerde olduğu gibi bağlamda kullanımını açıklayan bir belge bulamıyorum .

Dolar işareti olduğu gibi bir parametre genişletme içindeki parantez öncesinde olmalıdır çünkü bir parametre genişletme olduğunu sanmıyorum ${}.

Bir küme ayracı genişletmesi de olamaz , çünkü isteğe bağlı {x..y[..incr]}, nerede xve yisteğe bağlı değildir.

Ayrıca olamaz komut gruplama , çünkü ya {}argümanlar olarak kullanılır.

Sorular

  1. Bir çift parantez {}, genel olarak, onu kabul eden herhangi bir komuta argüman olarak ne anlama geliyor?

  2. Bağımsız {}değişken olarak kullanımını açıklayan bir belgeyi nerede bulabilirim ?


Bazı komutlar bu seçeneklere sahiptir {}- komutla targetshareket etmek, dosyaları findkaldırmak / rmbulmak için kullanılır.
Tuyen Pham

Yanıtlar:


16

Bu kıvırcık diş telleri bash tarafından yalnız bırakılır; bunlar sırasıyla aittir findve kılavuz xargssayfalarında açıklanmıştır.

man find

-exec komuta ;

Yürütme komutu ; 0 durumu döndürülürse true. Bulmak için aşağıdaki tüm bağımsız değişkenler, oluşan bir bağımsız değişkenle ;karşılaşılana kadar komutun bağımsız değişkenleri olarak alınır . Dize {}, bazı sürümlerinde olduğu gibi, yalnızca yalnız olduğu bağımsız değişkenlerde değil, komutun bağımsız değişkenlerinde gerçekleştiği her yerde işlenen geçerli dosya adıyla değiştirilir find. Bu yapıların her ikisinin \de kabuk tarafından genleşmesini önlemek için kaçması (a ile ) veya alıntı yapılması gerekebilir . -execSeçeneğin kullanımına ilişkin örnekler için ÖRNEKLER bölümüne bakın . Belirtilen komuteşleşen her dosya için bir kez çalıştırılır. Komut başlangıç ​​dizininde yürütülür. -exec Eylemin kullanımıyla ilgili kaçınılmaz güvenlik sorunları vardır ; Eğer kullanmalıdır -execdiryerine seçeneği.

-exec komuta {} +

-execEylemin bu değişkeni , seçilen dosyalarda belirtilen komutu çalıştırır , ancak komut satırı, seçilen her dosya adı sonuna eklenerek oluşturulur; komutun toplam çağrı sayısı, eşleşen dosya sayısından çok daha az olacaktır. Komut satırı, xargskomut satırlarını oluşturanla aynı şekilde oluşturulur. {}Komut içinde yalnızca bir örneğine izin verilir. Komut başlangıç ​​dizininde yürütülür. Bir findhatayla karşılaşırsanız, bu bazen hemen çıkışa neden olabilir, bu nedenle bekleyen bazı komutlar hiç çalıştırılmayabilir. Bu varyant -execdaima doğrudur.

-execdir komuta ;

-execdir komuta {} +

Beğen -exec, ancak belirtilen komut, normalde bulmaya başladığınız dizin olmayan eşleşen dosyayı içeren alt dizinden çalıştırılır. Bu, eşleşen dosyalara giden yolların çözümü sırasında yarış koşullarından kaçındığı için komutları çağırmak için çok daha güvenli bir yöntemdir. Eylemde olduğu gibi -exec , + biçimi, -execdir birden fazla eşleşen dosyayı işlemek için bir komut satırı oluşturur, ancak verilen herhangi bir komut çağrısı yalnızca aynı alt dizinde bulunan dosyaları listeler. Bu seçeneği kullanırsanız, $PATHortam değişkeninizin başvurmadığından emin olmalısınız.; aksi takdirde, bir saldırgan çalışacağınız bir dizinde uygun şekilde adlandırılmış bir dosya bırakarak istedikleri komutları çalıştırabilir -execdir. Aynı şey $PATH, boş veya mutlak dizin adları olmayan girdilere sahip olmak için de geçerlidir . Bir findhatayla karşılaşırsanız, bu bazen hemen çıkışa neden olabilir, bu nedenle bekleyen bazı komutlar hiç çalıştırılmayabilir. Eylemin sonucu +, ;varyantın mı yoksa varyantın mı kullanıldığına bağlıdır; -execdir komut {} + her zaman true değerini döndürürken , -execdir komut {} ; yalnızca command 0 döndürür.

man xargs

-I replace-str

Replace -str örneklerini değiştirin adları standart giriş okunan başlangıç-argümanlar. Ayrıca, alıntılanmamış boşluklar giriş öğelerini sonlandırmaz; bunun yerine ayırıcı yeni satır karakteridir. Anlamına gelir -xve -L 1.

-i[ replace-str ],--replace [ =replace-str ]

Bu seçenek ile eşanlamlı -I-str replace eğer değiştirin-str belirtilir. Eğer -str yerine argüman eksik, etkisi aynıdır -I{}. Bu seçenek kullanımdan kaldırılmıştır; kullanın -I.

Düzenleme: ve burada NEDEN bash bu süslü parantezleri görmezden geliyor:

man bash

{ liste; }

liste sadece geçerli kabuk ortamında yürütülür. liste bir satırsonu veya noktalı virgülle sonlandırılmalıdır. Bu, grup komutu olarak bilinir. Dönüş durumu listenin çıkış durumudur. Meta karakterlerden ( ve ) farklı olarak , { ve } ayrılmış kelime ve ayrılmış bir sözcük kabul edilmesi için izin verilen durumlarda meydana gelmesi gerekir. Sözcük kesintisine neden olmadıkları için, boşluk veya başka bir kabuk metakarakteriyle listeden ayrılmalıdır.

Vurgu için: liste bir satırsonu veya noktalı virgülle sonlandırılmalıdır .


1
Teşekkür ederim! Ben kim yazdı rahatsız ediyorum man xargshatta anlatmaya rahatsız etmedi {}aslında araçları, ne de yazar yönlendirmeyi (hayır cinas tasarlamak) açıklama okuyucuyu yaptılar -execadamı sayfa içi find.
Niko Gambt

@NikoGambt - Sempati duyuyorum ...
tink

5
@NikoGambt Pekala, {} kullanımdan kaldırılmış olan -i için varsayılan değer olması dışında xargs için bir şey ifade etmiyor. Bunun ötesinde hangi açıklamanın gerekli olduğundan emin değilim. Gönderdiğiniz örnekte, aynı zamanda xargs -Iab echo ab; tamamen keyfi bir seçim.
Random832

@ Random832 Daha fazla test yaptıktan sonra -I, bu seçeneğin gerçekte ne yaptığını anlıyorum. Evet, {}dediğin gibi keyfi. Sadece açıklama ile kafam karıştı If the replace-str argument is missing, the effect is the same as -I{}. Eğer -Iargüman olmadan aynı şekilde idi -I{}, daha sonra cat foo | xargs -I echo {}çalışan aynı sonucu üretecektir cat foo | xargs -I{} echo {}. Ancak bunlar aynı değil. Birincisi bir hatadır ve beni daha da şaşırtan şey hata mesajıydı xargs: {}: No such file or directory, ancak bu sadece uygulamadan kaynaklandı.
Niko Gambt

1
@NikoGambt -I(büyük harf I) edemez bir argüman olmadan çalıştırılabilir. İddia -Ioldu echo. Bu -Ive arasındaki birincil farktır -i(ve
-i'nin
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.