2016-03-24 14 views
3

'a aktarılan bir komutla referans olarak gönderme Komutların ve adların bir dosyasını okuyan basit bir dmenu komutu yapmak istiyorum. Daha sonra isimleri alır ve dmenu kullanarak görüntüler, sonra dmenu'nun çıktısını alır ve ilgili komutu tekrar kullanarak dosyayı çalıştırır.strokut'u

Dmenu'nun isimleri gösterdiği noktaya geldim, ama aslında oradan nereye gideceğimi bilmiyorum. Bash öğrenmek benim için gerçekten çok zor bir görevdir ve gerçekten bu basit betik/komutla nereden başlayacağımı bilmiyorum. Burada

dosyasıdır:

Pushbullet 
google-chrome-stable --app=https://www.pushbullet.com 
Steam 
steam 
Chrome 
google-chrome-stable 
Libre Office 
libreoffice 
Transmission 
transmission-qt 
Audio Control Panel 
sudo pavucontrol & bluberry 

ve burada benim komut için bugüne kadar ne var:

awk 'NR % 2 != 0' /home/rocco/programlist | dmenu | ??(grep -l "stdout" /home/rocco/programlist....) 

Benim düşüncesi olduğunu yapabilirdim nasılsa ile grep veya awk içine boru Uygulamanın adı daha sonra satır numarasını al, sonra bir tane ekle ve bunu sh'a çevir. Size varsayarsak

Teşekkür

+2

Bash 4'ü çalıştırıyorsanız, komutun adını anahtar ve komut olarak saklamak için [İlişkilendirilmiş Diziler] 'i (http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays) kullanabilirsiniz. değer. [Bash SSS 50'yi okumanızı tavsiye etmeme rağmen (bir değişkene bir komut koymaya çalışıyorum ama karmaşık durumlar her zaman başarısız!)] (Http://mywiki.wooledge.org/BashFAQ/050) senaryonuz için en iyi yaklaşımdır. –

cevap

0

gibi deneyimleri olan alanlara sahip olmak için gereklidir. dmenu ile ilgili deneyimim yoktur, ancak nasıl çalıştığını doğru bir şekilde anlarsam, bu sizin istediğiniz şeyi yapmalıdır. $(…)'da bir komutu kaydırmak, çıkışı başka bir komutta iletebileceğimiz bir değişken olarak döndürür.

#!/bin/bash 
plist="/home/rocco/programlist" 
# pipe every second line to dmenu 
selected=$(awk 'NR % 2 != 0' "$plist" | dmenu) 
# search for the selected item, get the command after it 
cmd=$(grep -A1 "$selected" "$plist" | tail -n 1) 
# run the command 
$cmd 

Sorunuzda bir hataya değinmeye değer. dmenu, stdout veya standart çıktıya gönderir, ancak sonraki program stdin veya standart giriş olarak okunabilir. Her durumda, grep standart girdi üzerinde desen alamıyor, bu yüzden bir yere boruyu denemek yerine bir değişkene kaydettim.

0

kullanabilirsiniz çalışma dizinde programlist.txt var:

awk 'NR%2 !=0' programlist.txt |dmenu |awk '{system("grep --no-group-separator -A 1 '"'"'"$0"'"'"' programlist.txt");}' |awk '{if(NR==2){system($0);}}'

Not birinci awk envocation içinde $0 arasında alıntı. Bu, "Libre Office"