Aynı komutu farklı bir parametre ile yeniden çalıştırma


13

Aşağıdaki komutu çalıştırabileceğimi biliyorum

ls Some{File,Folder}

Ve bunu çalıştırmakla eşdeğerdir:

ls SomeFile SomeFolder

(Bunun gibi şeyler için de çok kullanıyorum mv place_{a,b})

Ancak, böyle bir şey yapabileceğim farklı bir kısayol olup olmadığını merak ediyordum:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

Ve sadece yazmak zorundaydım run-command --a --whole --lot --of --flags parameter {a,b}ya da benzer bir şey.


Buna bağlı olarak run-command, birçok Unix komutu birkaç dosya bağımsız değişkenini sırayla işler.
vonbrand

Yanıtlar:


13

GNU bashveya benzeri bir şey kullandığınızı varsayarsak :

Belki bir fordöngü?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

aynı zamanda tek bir satırda yazılabilir for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
ya da çalıştırmak istediğiniz bir sürü varsa bash genişleme gibi kullanabilirsinizfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

Oraya giden, birçok yönden oluşturulan bir boşlukla ayrılmış liste olabilir . Yani evet, {a..z}, *.pdf, $(find ...)...
njsg

Aklım neden döngülere atlamıyor bilmiyorum. Teşekkürler! Muhtemelen kullandığım şey bu olacak. İşlev fikri iyi, ama bunu daha çok seviyorum.
Ocak'ta

1
Tek astar benim için ancak ;aşağıdaki doanahtar kelimeyi kaldırdıktan sonra çalıştı .
jimp

@jimp Teşekkürler, bunu kaldırmak için kodu değiştirdim ;.
njsg

5

Bunu komut dosyası yapmıyorsanız ve sadece bir komut satırında kolayca çalıştırmak istiyorsanız, xargskomut muhtemelen aradığınız şeydir.

xargs, standart girdiden bir grup içerik alır ve bunu komut için bağımsız değişken olarak kullanır ve gerekirse bu komutu birden çok kez çalıştırır.

Takip etmeyi dene:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

Bu örnekte, yalnızca xargs'a çalıştırılmasını istediğiniz permütasyonları veriyorsunuz.

"-N 1" bayrağı, xargs'a çalıştırma başına bağımsız değişkenlerden yalnızca 1 tanesini kullanmasını bildirir.

"-D," bayrağı, xargs'a girişte çalıştırılacak bağımsız değişkenler arasındaki ayırıcı olarak bir "," aramasını söyler. (Bağımsız değişkenin içinde "," varsa, bunu başka bir şeye değiştirmeniz gerekir. Bağımsız değişkenlerinizde boşluk yoksa, bu bayrağı tamamen atlayabilirsiniz.)

Daha man xargsfazla bilgi için bakınız .


4

Ayrıca sonunda değişen argümanınızı elde etmenizi sınırlamayan bir işlev de kullanabilirsiniz:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b

2

Bir önceki komutta değişiklik yapabilirsiniz. Bu, {a, b} örneğinizle çalışmaz, çünkü tüm 'a' örnekleri bir 'b' ile değiştirilir. Ancak aşağıdaki komutları uygulamak istediğinizi düşünün:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

İle yapabilirsin

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Bash oyuncu değişikliğini yapacak ve koşacak

run-command --a --whole --lot --of --parameter --format json

Yalnızca birini değil, birden fazla oyuncu değişikliği gerçekleştirmek için gs (global oyuncu değiştirme) kullanın.


1

aliasBash'de komut var :

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

Kullanımı: $ shotcommand a


Kod biraz daha karmaşıksa işlevler de vardır :-)
njsg

2
Bu çözüm yalnızca değişen parametrem sonuncuysa çalışır, değil mi?
ashays

Evet. Haklısın.
dchirikov
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.