Belirli bir satırı metin dosyasında komut olarak nasıl çalıştırabilirim?


11

Bazen bir kabuk komut dosyasında olan tek bir komut yürütmek gerekir.

sed -n 'line_num p'Bu satırı yazdırabileceğini zaten biliyorum . Ancak, yazdırılan belirli satırı komut olarak nasıl yürütebilirim?

Yanıtlar:


10

Bu adamı dene =):

sed -n 'line_num p' | bash

veya

"$(sed -n 'line_num p')"

@mikeserv Kendi eğitimim için bu ifadenin içeriğini bilmek istiyorum.
— Bratchley

Gerek arasına boşluk koymak line_numve pböylece örneğin eğer line_num123 ise, o zaman yapabilirsiniz sed -n 123p | bash. Ve eğer shyeterliyse, sadece shyerine kullanın bash.
— janos

Yani, sed -n 'line_num p' | shbaşka bir çözüm olabilir mi? Bunun daha fazla uyumluluğu var mı?
— Zen

1
@Zen - bu komut dosyası için hangi kabuğun hedeflendiğine bağlıdır. Ayrıca, kabuğun shgerçekte ne olduğuna da bağlıdır . Debian (ve türetilmiş) sistemlerde shgenellikle vardır dash. Komut dosyası için yazılırsa dash (veya taşınabilir sözdizimine bağlıysa), muhtemelen, evet, ancak yazılırsa bashneredeyse kesinlikle değil.
— mikeserv

Bu, geçmiş dosyasıyla yapılabilir mi, eğer koşarsam historyve 900 hattını çalıştırmak istediğimi görürsem, 900 hattını bir şekilde çalıştırabilir miyim?
— codecowboy

3

Bunu etkileşimli olarak yapıyorsanız, satırı bash tarihine yazabilirsiniz:

history -s "$(sed -n 'line_num p')"

Sonra ↑Entersatırı okuma satırı arabelleğine eklemek ve yürütmek için tuşuna basın ; bu size geç olmadan çizgiye bakma şansı verir.


Bu oldukça zekice ve muhtemelen iyi bir varsayım.
— mikeserv

Bu -s seçeneği burada ne anlama geliyor? Açıklamaları bulamıyorumman history
— Zen

@zen: historyyerleşiktir, bu nedenle belgelenmiştir help history(veya man bashbu çok fazla okuma). Yukarıdakilerden alıntı yapıldığında, history -s"ARG'leri geçmiş listesine tek bir giriş olarak ekleyecek"
— rici

2

Yapabilirsin...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

Bu $NUM, kabuk değişkenindeki komut dosyanızdan yalnızca satırı alır $lineve geçerli kabukta bir komut olarak değerlendirir.

Bunu yapmanın başka bir yolu şöyle görünebilir:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
'eval', 'kötülük'ün ortak bir yanlış yazımıdır. Eval cevabı ise, kesinlikle yanlış soruyu soruyorsun. Bkz. Mywiki.wooledge.org/BashFAQ/048
— Gilles Quenot

1
Evet. Herkes sever eval.
— mikeserv

gnu sedvardır ebir şey gibi pek bayrağı sed "${NUM}"'!d;s/^//e;q'da iş olur
— don_crissti

2

Senaryonuzu vim ile düzenliyor musunuz (Linux'ta vi)? Vi'de bir eşleme ekleyin:

:nmap <F4> Y:!<C-R>"<C-H><CR>

ve daha sonra vi tuşuna basın.


-2

Bash'de aşağıdaki komutu çalıştırabilirsiniz:

for line in $(cat file.txt); do command $line; 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.