Sie sind nicht angemeldet.

1

13.10.2012, 22:26

Letztes Pipe-Kommando (nicht nur pipestatus)

Hi
Ich bastel gerad an einem alias (oder wirds ne funktion?) die mir bei erledigung eines kommandos per notify-send bescheidsagt.
angefangen hat das mal mit folgendem in der .zshrc :

alias -g ASD=';if [ "$?" -eq "0" ];then;beep -f 330 -l 100 -d1 -n -f 277 -l 100 -d1 -n -f 330 -l 100 -d 1 -n -f 440 -l 330;else;beep -f 988 -l 180 -d 33 -n -f 831 -l 110;fi;'

meine notify-lösung soll dabei ein wenig weiter gehen..
true | true | false;STATUS=$pipestatus;CMD=" ";echo $STATUS;if [ "$(echo $STATUS | tr -s ' ' + |bc)" != "0" ] ;then notify-send -t 500000 "$(date)" "error! $STATUS $CMD";else notify-send -t 500000 "$(date)" "YES $STATUS $CMD"; fi

Soweit funzt das auch. Allerdings möchte ich als Nachricht das komplette Kommando haben...einfach ein CMD="!!" geht leider nicht. Ich hab versucht mir das aus der history zu ziehen aber das geht nur bedingt gut da ich mir den Zeitcode vor ausführen des befehls notieren muß weil er nach beendigung des gepipeten befehls nicht mehr unbedingt der letzte ist.
das allerdings wirft das problem auf das zw dem TIME=$(date +%s);true;true;false; und dem eintrag ins history-file auch zeit vergeht...ergo findet er manchmal, zB bei ungültigen pingbefehlen, den aufgerufenen Befehl nicht mehr anhand des $TIME wertes.
wahrscheinlich gibts da auch was eleganteres als das gegrepe im historyfile. Meine wenn es $pipestatus gibt warum dann nich auch $pipecmd ?

bin gespannt...eigentlich sollte das mein erstes post auf commandlinefu werden aber wird halt nich fertig :-(

2

15.10.2012, 07:31

Ich würde dir gerne helfen ... uhm bin aber zu doof für die Beschreibung deines Vorhabens.

Kannst du das ein wenig umformulieren, damit ich auch damit zurecht komme ... so mit Fingerfarben.

- Zunächst du nimmst zsh ... Grund?
- Und du hättest gerne den letzten Befehl vor der Pipe oder den in der Pipe vorher ... *verwirrung*
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

3

15.10.2012, 18:43

ja stimmt schon war bisl durcheinander formuliert...also:

zsh warum? öhm kA hat sich so durchgesetzt noch aus den zeiten wo ich viel mit grml rumgespielt habe..kein besonderer Grund, mochte immer die komplitierungsfunktion(auswahl mit pfeiltasten möglich statt x-mal TAB)...

Mit $pipestatus kannst du dir ja alle exitcodes des letzten pipebefehles anzeigen lassen.
Beispielcmd: true | true | false
$pipestatus="0 0 1"
(nicht getestet sollte aber gehen...hatte immer sowas mit cat bla.txt |grep bla)

Ich hätte gerne den kompletten befehl incl aller pipes, also zu $pipestatus="0 0 1" entsprechend $pipecmd="true | true | false" um im nachhinein noch prüfen zu können was in dem fehlgeschlagenen Teil ausgeführt werden sollte.

PS:Ich finds total egoistisch von dir wenn du mein rumgestammel nicht verstehst und das dann auf dich beziehst :P

4

16.10.2012, 07:24

Schwierig. Ich habe mal mich mit BASH_XTRACEFD gespielt ...

Quellcode

1
2
3
dyle@semirhage ~ $ exec 3<> bash.trace
dyle@semirhage ~ $ export BASH_XTRACEFD=3
dyle@semirhage ~ $ bash -x


Da sieht man dann bei

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dyle@semirhage ~ $ echo "Hello World" | grep x | wc -l
0
dyle@semirhage ~ $ cat bash.trace 
...
+ alias 'cal=cal -3m'
++ echo -ne '\033]0;dyle@semirhage:~\007'
+ echo 'Hello World'
++ echo -ne '\033]0;dyle@semirhage:~\007'
+ cat bash.trace
++ echo -ne '\033]0;dyle@semirhage:~\007'
+ grep --colour=auto x
+ echo 'Hello World' 
+ wc -l
++ echo -ne '\033]0;dyle@semirhage:~\007'
+ cat bash.trace
einen schönen Effekt: die Pipe-Commandos werden alle parallel gestartet (guck: zuerst taucht das grep auf, dann das echo und dann erst wc -l, obwohl die Reihenfolge in der Pipe umgekehrt war).

Wenn du in diese Richtung arbeitest, dann denke ich, bist du auf sehr, sehr dünnem Eis unterwegs.

Gibt es nicht einen komplett anderen Lösungsansatz? Was ist das eiegntliche Problem zu das deine Arbeit die LÖsung darstellen soll?
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

5

16.10.2012, 22:48

Ich will nur eine kleine Benachrichtigung über den Ausgang des Kommandos. Kein spezieles, sondern jedes x-beliebige was ein paar minuten bis stunden dauert. Der Code in meinem 1. Post funktiniert doch bestimmt bei dir? (ASD-Alias)
Der Name ist reine Bequemlichkeit, Anwendung wäre zB "cave sync ASD" ..nach ein paar minuten hör ich ne kleine melodie ausm PC-Speaker und weiß a.) das es ist fertig ist und b.) je nachdem welche melodie kommt obs ein problem gab oder nicht.

Das ganze wollte ich jetzt aber nicht mehr ausm PC-Speaker hören sondern als Textmessage sehen und in der Message sollte halt derkomplette Befehl nochmal sein. Momentan krieg ich das nur für die 1. Pipe hin, also alle vor dem 1. "|".

Ist so gesehen kein richtiges Problem was mir schlaflose Nächte bereitet aber eins was mich auch nicht losläßt. Muss sagen meine zeit ist gerade zu begrenzt für größe Probleme..
Anderer Lösungsansatz gabs auch schon schien mir aber komplizierter.
Ich hatte eine Funktion die als Argumente den restlichen befehl aufnimmt. Leider kann ich als Funktionsargument kein Kommando mit einer Pipe darin benutzen. Und ich will nicht irgendwie Escapen müßen damit die Pipe erstmal ignoriert wird..

Zielsetzung ist ein beliebiges Kommando mit einem global Alias erweitern können so daß es sich nach erledigung des Vorgangs artig bei mir aufm Desktop meldet.


Hoffe ich hab mir nicht wieder zu verquirrlt ausgedrückt. Leide an chronischem Schlafmangel seit meine Freundin vor 3 Wochen dieses kleine süße Freßmonster in die Welt gesetzt hat..

6

18.10.2012, 07:41

Naja, das

Zitat

Quellcode

1
alias -g ASD=';if [ "$?" -eq "0" ];then;beep -f 330 -l 100 -d1 -n -f 277 -l 100 -d1 -n -f 330 -l 100 -d 1 -n -f 440 -l 330;else;beep -f 988 -l 180 -d 33 -n -f 831 -l 110;fi;'
greift ja nur auf das Ergebnis des letzten Befehls zu.

Ich sehe das Grundproblem so einen Befehl/Alias darin, dass die Shell ja eine Pipe konstruiert, bevor sie dir die Teile in die Hand drückt. Also:

Quellcode

1
$ my_alias do_this | do_that | do_other_things
resultiert darin, dass "my_alias" NUR do_this bekommt und nicht die ganze Kette/Pipe. Da sehe ich nicht, wie man ohne Quote and sonstige Shell-Magik darum herumkommt.

Interessantes Problem ...
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>