Tek bir satırda birden çok komuta argüman iletme


10

Tek bir satırda aynı dosya üzerinde birden fazla komut çalıştırabilmek istiyorum. Şu anda bunu yapmak yolu:

commandA file && commandB file && perl -ne '...' file

Bağırsak içgüdüm, dosya adı argümanını yalnızca bir kez sağlamanın ve her iki komuta da aynı anda xargsveya benzer bir şeyle iletmenin bir yolu olması gerektiğini söylüyor :

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

Bunu denediğimde, sadece ilk komut çalışır. Yapmak istediğim şeyi nasıl başarabilirim?

Yanıtlar:


12

Bunun için yerel bir değişken tanımlayabilirsiniz:

f=file; commandA $f && commandB $f && ...

Ayrıca tüm koşulsuz (yerine yürütebileceği &&ile ;) veya paralel olarak (yerine &&birlikte &).

Alternatif olarak, önceki bağımsız değişkenlere başvurmak için kabuk geçmişi genişletmesini de kullanabilirsiniz:

commandA file && commandB !:1 && ...

Aklımdakiler değil, ilginç bir alternatif.
Zaid

Bu cevapta yanlış olan ne?
Chris

Bu gerçekten havalı! Yeni bir değişken tanımlamamın bir yolu var mı?
kullanıcı

@user, bir alternatif ekledim.
maxschlepzig


2

Komut satırı oluşturmak için xargs kullanabilirsiniz, örneğin:

echo file | xargs -i -- echo ls -l {}\; wc -l {}

Sadece yukarıdaki çalıştırmak için bash boru.

echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash

Geçerli dizindeki tüm * .c dosyaları Örneğin genişletme (kaçan ls herhangi kabuk takma ikamesi önlemek için buraya):

\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash

Bunu, adın "numaralar" gibi olduğu dizinlerde bulunan tüm dosyaların bir listesini almak için kullanılır: find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
Matt Lachman

1

Ben buna oy vermezdim. Aptalca ve tehlikeli, ama sadece bunu yapmanın yollarını listelemek için:

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

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.