2016-03-24 5 views
3
weitergeleitet wurde

Ich möchte einen einfachen Befehl dmenu machen, der eine Datei mit Befehlen und Namen liest. Nimmt dann die Namen und zeigt sie mit dem dmenu an, nimmt dann die Ausgabe von dmenu und führt den zugehörigen Befehl unter Verwendung der Datei erneut aus.Verweise auf stdout in einem Befehl, der an

Ich kam zu dem Punkt, wo Dmenu die Namen anzeigt, aber ich weiß nicht wirklich, wo ich von dort aus gehen soll. Lern-Bash ist eine wirklich schwierige Aufgabe für mich und ich weiß nicht wirklich, wo ich mit diesem scheinbar einfachen Skript/Befehl anfangen soll.

hier ist die Datei:

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 

und hier ist das, was ich bisher für meinen Befehl habe:

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

Es war mein Denken, dass ich irgendwie Rohr in grep oder awk mit der Name der Anwendung dann erhalten Sie die Zeilennummer dann fügen Sie eins und pipe das in sh.

Dank

+2

Wenn Sie Bash 4 ausführen, können Sie [Assoziative Arrays] (http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays) verwenden, um den Namen des Befehls als Schlüssel und den Befehl selbst als zu speichern der Wert. Trotzdem empfehle ich Ihnen, [Bash FAQ 50 (Ich versuche, einen Befehl in eine Variable zu setzen, aber die komplexen Fälle scheitern immer!)] (Http://mywiki.wooledge.org/BashFAQ/050) und entscheiden was ist der beste Ansatz für Ihr Szenario. –

Antwort

0

Ich habe keine Erfahrung mit dmenu, aber wenn ich verstehe, wie es richtig funktioniert, sollte dies tun, was Sie wollen. Ein Wrapping eines Befehls in $(…) gibt die Ausgabe als eine Variable zurück, die wir an einen anderen Befehl weitergeben können.

#!/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 

Erwähnenswert einen Fehler in Ihrer Frage. dmenu sendet an stdout, oder Standard-Ausgabe, aber das nächste Programm in Zeile würde lesen stdin oder Standard-Eingabe. In jedem Fall kann grep Muster nicht auf Standardeingabe nehmen, weshalb ich in einer Variablen gespeichert habe, anstatt zu versuchen, es irgendwo zu pipen.

0

Sie haben Angenommen programlist.txt im Arbeitsverzeichnis können Sie:

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

Notiere die von der in der ersten awk envocation $0 zitieren. Dies ist notwendig, um Namen mit Leerzeichen in ihnen wie "Libre Office"

Verwandte Themen