Mejsla ut ”progress-%” från terminalprogram

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Har nu försökt ”allt” men inte lyckats.

Mitt mål är att ha en fungerande grafisk ”progress bar” som följer de siffror som ett visst terminalprogram spottar ur sig. Terminalprogrammet heter ”flac” och finns väl inte som standard i Ubuntu, men kan installeras från programcentralen eller med:

Kod: Markera allt

sudo apt-get install flac
Som ”progress bar” använder jag zenity --progress-bar, men än så länge har jag inte ens kommit så långt så att jag har blandat in zenity.

Vad man brukar göra är tydligen, enligt vad jag funnit på nätet, att man spottar ur sig siffror och sedan gör en pipe till zenity, som då använder dessa siffror för att visa förloppet. Här är lite kod jag hittade som visar hur man kan göra:

Kod: Markera allt

#!/bin/sh
(
echo "10" ; sleep 1
echo "# Uppdaterar e-postloggar" ; sleep 1
echo "20" ; sleep 1
echo "# Nollställer cron-jobb" ; sleep 1
echo "50" ; sleep 1
echo "Den här raden kommer att ignoreras" ; sleep 1
echo "75" ; sleep 1
echo "# Startar om systemet" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
	--title="Uppdaterar systemloggar" \
	--text="Söker av e-postloggarna..." \
	--percentage=0
Det sista där, ”--percentage=0”, är bara startvärdet på stapeln. Kan bli lite förvirrande om man tror något annat…

Så programmet jag vill köra kräver ju först och främst att man har en giltig FLAC-fil och om sådan saknas kan man ju låna en av mig här, spara den bara på disken och undvik gärna att lyssna på den.

%-siffrorna, tillsammans med en massa oönskat skräp, får man ut i terminalen om man skriver

Kod: Markera allt

flac -t Filnamn
Filnamn är själva FLAC-filen. Problemet är bara att få ut endast siffrorna och inget annat. Det närmaste jag kommit hittills var att få ut hela raden till en fil med:

Kod: Markera allt

flac -ct Filnamn 2>flactest
Filen ”flactest” såg då ut så här:
flac 1.2.1, Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson
flac comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
welcome to redistribute it under certain conditions. Type `flac' for details.

Filnamn: testing, 27% complete
Filnamn: testing, 54% complete
Filnamn: testing, 82% complete
Filnamn: ok
Har försökt på olika sätt, bland annat med grep, att bara få ut raderna med %-siffrorna, men inget har lyckats hittills. De ska ju komma ut i realtid också, det duger ju alltså inte att först omdirigera till en fil och därefter fixa resten från filen, för då är det ju redan för sent, så att säga.

Vad jag har provat med hittills är ju olika kombinationer av omdirigering och grep, men det känns inte som att den vägen är framkomlig, i alla fall inte för mig just nu…

Tacksam för alla som helst tänkbara tips och idéer.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Johnny Rosenberg skrev:Det närmaste jag kommit hittills var att få ut hela raden till en fil med:

Kod: Markera allt

flac -ct Filnamn 2>flactest
Filen ”flactest” såg då ut så här:
flac 1.2.1, Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson
flac comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
welcome to redistribute it under certain conditions. Type `flac' for details.

Filnamn: testing, 27% complete
Filnamn: testing, 54% complete
Filnamn: testing, 82% complete
Filnamn: ok
Om filen verkligen ser ut precis så där så borde det ju gå med grep eller sed eller awk eller motsvarande.

Eftersom det tydligen inte går så misstänker jag att svårigheten du har stött på kommer av kontrolltecken som används för att styra var i terminalen utdatan hamnar. Det brukar åtminstone finnas inbakat sådana i utdatan när terminalprogram räknar upp hur långt de har hunnit med vad det nu är de ska göra. Jag antar att flac inte är något undantag.

Det går förstås att ta sig runt om man vet vilka kontrolltecken det rör sig om och var i utdatan dessa finns. Så mitt tips är att undersöka utdata-filen lite noggrannare.
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av m!rage »

Det handlar om ^H, alltså backspace-koden om jag inte har fel. Öppna utfilen i nano så får du se. Jag har lekt lite men även jag kört fast. Detta har jag kommit fram till:

Kod: Markera allt

$ flac -t 07.\ Rock\ Nuts.flac 2>&1 | egrep -o '[0-9]*%' 
4%
9%
13%
18%
22%
27%
31%
36%
40%
45%
49%
54%
58%
63%
67%
72%
All utdata kommer dock efter att flac avslutats, så det har man inte mycket nytta av. Hämtningen av din fil avbröts av någon anledning vid 72%, därför stannar flac där.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

m!rage skrev:Det handlar om ^H, alltså backspace-koden om jag inte har fel. Öppna utfilen i nano så får du se. Jag har lekt lite men även jag kört fast. Detta har jag kommit fram till:

Kod: Markera allt

$ flac -t 07.\ Rock\ Nuts.flac 2>&1 | egrep -o '[0-9]*%' 
4%
9%
13%
18%
22%
27%
31%
36%
40%
45%
49%
54%
58%
63%
67%
72%
All utdata kommer dock efter att flac avslutats, så det har man inte mycket nytta av. Hämtningen av din fil avbröts av någon anledning vid 72%, därför stannar flac där.
Märkligt. Jag testade med grep (dock ej egrep) men fick inget resultat alls… men då använde jag inte -o, men jag kan inte se att utelämnandet av den inte skulle ge något svar alls (förutom ”07. Rock Nuts.flac: ok” – ett svar som jag inte får med -o). Ser inte riktigt logiken, men det har kanske med styrtecknen att göra…

Märkligt att hämtningen avbröts vid 72% förresten. Kanske var något tillfälligt? Men detta är nog första gången jag hivar iväg en Ubuntu One-länk någonstans, så jag har inga erfarenheter om hur pålitligt det är.

Att den väntar med att räkna upp tills flacs jobb är avklarat borde väl bero på att grep kanske buffrar på något sätt. Har kollat lite i grep-dokumentationen, men inte hittat något bot mot det. I sed däremot, finns ju -u-flaggan, men jag lyckas inte få till det med enbart sed, utan det är först när grep -o (får samma resultat med den som med egrep -o) som sed börjar leverera. Använder då sed för att bli av med %-tecknet… Vet inte riktigt hur man klarar det med enbart grep (eller egrep).

Har nu testat ytterligare och funnit att zenity --progress inte störs av %-tecknen, så sed behövs alltså inte, så problemet nu är ju bara att grep spottar ur sig data i efterhand, så att säga.

Funderade tidigare också lite på varför jag bara fick 3 olika procentsatser tidigare i filen som jag dirigerade om till. Vet nu varför…

Har nämligen kollat vad som verkligen finns i filen, och det förekommer betydligt fler procentsatser än bara 3, kan jag säga. Mellan dem är det ett gäng '\x08', vilket enligt teckentabellen är Backspace, precis som sagts innan. Använde själv ghex2 för att se det, men finner nu också att det syns även i gedit:

Kod: Markera allt

Bobby.flac: testing, 3% complete
Bobby.flac: testing, 7% complete
Bobby.flac: testing, 10% complete
Bobby.flac: testing, 14% complete
Bobby.flac: testing, 17% complete
Bobby.flac: testing, 20% complete
Bobby.flac: testing, 24% complete
Bobby.flac: testing, 27% complete
Bobby.flac: testing, 31% complete
Bobby.flac: testing, 34% complete
Bobby.flac: testing, 37% complete
Bobby.flac: testing, 41% complete
Bobby.flac: testing, 44% complete
Bobby.flac: testing, 48% complete
Bobby.flac: testing, 51% complete
Bobby.flac: testing, 54% complete
Bobby.flac: testing, 58% complete
Bobby.flac: testing, 61% complete
Bobby.flac: testing, 65% complete
Bobby.flac: testing, 68% complete
Bobby.flac: testing, 71% complete
Bobby.flac: testing, 75% complete
Bobby.flac: testing, 78% complete
Bobby.flac: testing, 82% complete
Bobby.flac: testing, 85% complete
Bobby.flac: testing, 88% complete
Bobby.flac: testing, 92% complete
Bobby.flac: testing, 95% complete
Bobby.flac: testing, 99% complete

Bobby.flac: ok
Radbrytningarna efter ordet ”complete” har jag gjort manuellt här, annars hade det varit svårläst eftersom allt hade hamnat på samma rad.

Förra gången jag klistrade in filen här utgick jag från terminalen och ”more filnamn” (ja, jag vet att alla andra använder ”less”, men jag är en gammal gubbe… snart i alla fall). Rutorna ovan är i alla fall Backspace.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Hm… tittade igenom filen i ghex2 igen och tror mig nu veta varför det inte fungerar med de kommandon jag försökte, nämligen att under hela %-uppräkningen förekommer inte ett enda \x0A eller \x0D och både sed och grep är väl radbaserade, eller? Att det trots allt gick med grep -o kan ju ändå vara lite smålogiskt eftersom -o betyder att den ska slänga ur sig bara det som matchar mönstret. Det verkar alltså som att grep -o själv lägger dit sina radbrytningar, för inte finns de med i originalströmmen i alla fall.

Och detta förklarar också varför inte --line-buffered fungerar; det är ju bara en enda lång rad…

Skulle man kunna komma runt problemet genom att själv lägga dit radbrytningar efter varje %-tecken, exempelvis?

Ska testa lite…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Nej, fick det ändå inte att fungera… Försökte först med sed att byta ut alla %-tecken mot \n, men det verkar inte som att det blev något byte alls, för alla %-tecken var kvar efter bytet. Troligen jag som gjort något fel som vanligt:

Kod: Markera allt

flac -t 07.\ Rock\ Nuts.flac 2>&1 | sed -u 's/%/\n/' | grep --line-buffered -o '[0-9]*%'
Provade även med ”\%” istället för bara ”%” med med samma resultat, det vill säga %-tecknen var kvar och resultatet verkade buffrat.

Andra idéer? Ge upp…? ;D :( >:(
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Jag har hämtat källkoden till flac via apt-get source flac och ser då att det där med backspace-tecken verkar inte vara något att lita på. Så här ser den intressanta kodsnutten ut:

Kod: Markera allt

			fprintf(stderr, "\r%s: %s%u%% complete",
				decoder_session->inbasefilename,
				decoder_session->test_only? "testing, " : decoder_session->analysis_mode? "analyzing, " : "",
				(unsigned)floor(progress + 0.5)
			);
För den som inte är hemma på C-kod så kan jag meddela att den något otippat skriver ut carriage return och inte backspace. Det gav mig ganska mycket huvudbry innan jag hittade filen
debian/patches/03_cosmetic_flac_stats.dpatch:

Kod: Markera allt

#! /bin/sh /usr/share/dpatch/dpatch-run
## 03_cosmetic_flac_stats.dpatch by Joshua Kwan <joshk@triplehelix.org>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Fix misuse of \r (potentially) in flac -d or -t output, closes: #138828

@DPATCH@
--- flac-1.1.2/src/flac/decode.c~	2005-08-18 02:16:46.000000000 -0700
+++ flac-1.1.2/src/flac/decode.c	2005-08-18 02:14:59.000000000 -0700
@@ -1182,6 +1182,7 @@
 
 void print_stats(const DecoderSession *decoder_session)
 {
+	static int count = 0;
 	if(flac__utils_verbosity_ >= 2) {
 #if defined _MSC_VER || defined __MINGW32__
 		/* with MSVC you have to spoon feed it the casting */
@@ -1190,7 +1191,13 @@
 		const double progress = (double)decoder_session->samples_processed / (double)decoder_session->total_samples * 100.0;
 #endif
 		if(decoder_session->total_samples > 0) {
-			fprintf(stderr, "\r%s: %s%u%% complete",
+			while (count > 0 && count--)
+				fprintf(stderr, "\b");
+
+			if ((unsigned)floor(progress + 0.5) == 100)
+				return;
+			
+			count = fprintf(stderr, "%s: %s%u%% complete",
 				decoder_session->inbasefilename,
 				decoder_session->test_only? "testing, " : decoder_session->analysis_mode? "analyzing, " : "",
 				(unsigned)floor(progress + 0.5)
Det verkar vara så att debian, och följakligen även ubuntu, har en patchad version av flac som använder backspace, till skillnad från standardversionen av flac som använder carriage return. Det har tydligen med den här buggrapporten att göra:

http://bugs.debian.org/cgi-bin/bugrepor ... ug=138828+
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Johnny Rosenberg skrev:Hm… tittade igenom filen i ghex2 igen och tror mig nu veta varför det inte fungerar med de kommandon jag försökte, nämligen att under hela %-uppräkningen förekommer inte ett enda \x0A eller \x0D och både sed och grep är väl radbaserade, eller?
Standard-versionen av flac har \x0D vid varje uppräkningssteg, vilket jag tog upp i mitt förra inlägg. Men det det hjälper egentligen inte eftersom grep och sed bara bryr sig om \x0A som radavdelare.
Johnny Rosenberg skrev:Skulle man kunna komma runt problemet genom att själv lägga dit radbrytningar efter varje %-tecken, exempelvis?
Det borde väl gå bra tycker jag. Ska testa själv om en stund.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Sådär, nu har jag gjort ett försök, och det verkar fungera som jag tänkt mig:

Kod: Markera allt

flac -t filnamn.flac 2>&1 |
stdbuf -o0 tr '\b\r' '\n' |
stdbuf -o0 sed -n 's/.*:\s\(testing,\s\([^:]*\)\|[^:]*\)$/#\1\n\2/p' |
zenity --progress
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Konservburk skrev:Sådär, nu har jag gjort ett försök, och det verkar fungera som jag tänkt mig:

Kod: Markera allt

flac -t filnamn.flac 2>&1 |
stdbuf -o0 tr '\b\r' '\n' |
stdbuf -o0 sed -n 's/.*:\s\(testing,\s\([^:]*\)\|[^:]*\)$/#\1\n\2/p' |
zenity --progress
Vad måste jag installera för att stdbuf ska existera på min dator?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Johnny Rosenberg skrev:Vad måste jag installera för att stdbuf ska existera på min dator?
Det är en del av nya coreutils från version 7.5 och framåt. Jag antar att du kör LTS som bara har corutils-7.4?

Jag ska fundera lite och se om jag kan klara av det här utan stdbuf. Det är alltid kul med en utmaning. :)
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Johnny Rosenberg skrev:
Konservburk skrev:Sådär, nu har jag gjort ett försök, och det verkar fungera som jag tänkt mig:

Kod: Markera allt

flac -t filnamn.flac 2>&1 |
stdbuf -o0 tr '\b\r' '\n' |
stdbuf -o0 sed -n 's/.*:\s\(testing,\s\([^:]*\)\|[^:]*\)$/#\1\n\2/p' |
zenity --progress
Vad måste jag installera för att stdbuf ska existera på min dator?
Hittade svaret: Ingår i Coreutils – på min andra dator, men inte på denna. Skillnad: Min andra dator har Ubuntu 10.10 medan denna har Ubuntu 10.04. Ännu en anledning att uppgradera alltså… något jag ändå hade tänkt att göra i helgen, men det blev inte av…

Nåja, då har jag något att göra imorgon efter jobbet då…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Konservburk skrev:
Johnny Rosenberg skrev:Vad måste jag installera för att stdbuf ska existera på min dator?
Det är en del av nya coreutils från version 7.5 och framåt. Jag antar att du kör LTS som bara har corutils-7.4?

Jag ska fundera lite och se om jag kan klara av det här utan stdbuf. Det är alltid kul med en utmaning. :)
Oj, du hann skriva innan jag hann skicka det förra…

Okej, jag är i vilket fall i vilket fall som helst imponerad. Bara att känna till att det finns något som heter ”stdbuf” imponerar på mig… ;D
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Ett första försök utan stdbuf:

Kod: Markera allt

flac -t filnamn.flac 2>&1 |
xargs -n1 -d'\b' sh -c '
   echo "$0" | sed -n "s/.*:\s\(testing,\s\([^:]*\)\|[^:]*\)$/#\1\n\2/p"
' | zenity --progress
Jag har ännu inte kommit på något enkelt sätt att klara av både carriage return och backspace på en gång, så det fick bli bara backspace, åtminstone tills vidare.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Konservburk skrev:Ett första försök utan stdbuf:

Kod: Markera allt

flac -t filnamn.flac 2>&1 |
xargs -n1 -d'\b' sh -c '
   echo "$0" | sed -n "s/.*:\s\(testing,\s\([^:]*\)\|[^:]*\)$/#\1\n\2/p"
' | zenity --progress
Jag har ännu inte kommit på något enkelt sätt att klara av både carriage return och backspace på en gång, så det fick bli bara backspace, åtminstone tills vidare.
Japp, det fungerade. Petig som jag är så störde jag mig givetvis på att texten ovanför den liggande stapeln är i gemener, men det var ju enkelt att fixa.

Har försökt att förstå vad det är som händer och det mesta köper jag, men jag skulle gärna vilja ha en liten förtydligande förklaring av xargs-sh-biten om det går bra. Givetvis har jag kollat man-sidorna och jag förstår vad ”-d'\b'” gör, men sedan känns det inte som att jag har riktig järnkoll på vad som händer.

Exempelvis när det gäller ”man xargs” så förstår jag inte riktigt vad de menar med sin beskrivning av ”-n”. Vad då ”max-args”? Provade också med ”-l1” och det fungerade, det också. Däremot inte ”-s1”, men det var kanske inte så väntat heller.

Har försökt att ta bort vissa saker och se vad det blir för skillnad, men har då fått svårtolkade resultat… Det är lite som när man ska göra mätningar i en elektronisk krets som är så känslig att den påverkas av mätinstrumentet; man vet inte riktig vad man gör…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Johnny Rosenberg »

Hm… glömde ju en grej också, nämligen det viktigaste… Varför testar man något? Jo, för att se om det man testar är OK. Så anta att jag har en fil som inte är OK eller som inte ens är en FLAC-fil, då vill jag ju ha någon form av felmeddelande och sedan ska ju skriptet avslutas, känns ju rimligt. Det gick ju bra att göra så länge jag inte hade någon förloppsindikator (eller vad en progress bar nu ska kallas på svenska). Känns lite som att man vill äta kakan och ha den kvar…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av Konservburk »

Johnny Rosenberg skrev:Har försökt att förstå vad det är som händer och det mesta köper jag, men jag skulle gärna vilja ha en liten förtydligande förklaring av xargs-sh-biten om det går bra. Givetvis har jag kollat man-sidorna och jag förstår vad ”-d'\b'” gör, men sedan känns det inte som att jag har riktig järnkoll på vad som händer.

Exempelvis när det gäller ”man xargs” så förstår jag inte riktigt vad de menar med sin beskrivning av ”-n”. Vad då ”max-args”? Provade också med ”-l1” och det fungerade, det också. Däremot inte ”-s1”, men det var kanske inte så väntat heller.
Det xargs gör är att dela upp det som kommer på stdin i ord för att sedan köra det givna kommandot med dessa ord som argument. Här kommer xargs att dela upp indatan i tre ord; a, b, c och sedan köra kommandot echo foo a b c:

Kod: Markera allt

$ printf "a b\nc" | xargs echo foo
foo a b c
Men flaggan -n1 så körs kommandot flera gånger istället med de olika orden som det enda argumentet i tur och ordning:

Kod: Markera allt

$ printf "a b\nc" | xargs -n1 echo foo
foo a
foo b
foo c
Med flaggan -l1 så körs kommandot på nytt efter varje nyrad i indatan:

Kod: Markera allt

$ printf "a b\nc" | xargs -l1 echo foo
foo a b
foo c
I vårt fall har själva kommandot som xargs ska köra varit:

Kod: Markera allt

sh -c 'echo "$0" | sed -n "s/.*:\s\(testing,\s\([^:]*\)\|[^:]*\)$/#\1\n\2/p"' argument
Argumentet blir då vad som finns mellan två backspace eftersom vi har valt det tecknet som avdelare. I det inre skriptet dyker sedan detta argument upp som "$0" som vi genast skickar genom sed.

Här är ett enklare exempel som fungerar på samma sätt:

Kod: Markera allt

$ sh -c 'echo "[$0]"' hejsan
[hejsan]
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mejsla ut ”progress-%” från terminalprogram [50 % löst…]

Inlägg av Johnny Rosenberg »

Johnny Rosenberg skrev:Hm… glömde ju en grej också, nämligen det viktigaste… Varför testar man något? Jo, för att se om det man testar är OK. Så anta att jag har en fil som inte är OK eller som inte ens är en FLAC-fil, då vill jag ju ha någon form av felmeddelande och sedan ska ju skriptet avslutas, känns ju rimligt. Det gick ju bra att göra så länge jag inte hade någon förloppsindikator (eller vad en progress bar nu ska kallas på svenska). Känns lite som att man vill äta kakan och ha den kvar…
Ser nu att frågan är lite kryptiskt ställd, så det var nog ingen som förstod att det var en fråga över huvud taget…

Vad jag egentligen undrade var nog om man kan omdirigera till två ställen samtidigt, alltså dels till det här förloppsindikator-köret och dels till en fil, så att jag i efterhand kan söka igenom filen efter ordet "error" och på så vis få reda på om testet gick igenom eller inte.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Mejsla ut ”progress-%” från terminalprogram

Inlägg av m!rage »

Kod: Markera allt

tee foo
skickar text från stdin till stdout och skriver samtidigt till filen foo
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mejsla ut ”progress-%” från terminalprogram [50 % löst…]

Inlägg av Konservburk »

Johnny Rosenberg skrev:
Johnny Rosenberg skrev:Hm… glömde ju en grej också, nämligen det viktigaste… Varför testar man något? Jo, för att se om det man testar är OK. Så anta att jag har en fil som inte är OK eller som inte ens är en FLAC-fil, då vill jag ju ha någon form av felmeddelande och sedan ska ju skriptet avslutas, känns ju rimligt. Det gick ju bra att göra så länge jag inte hade någon förloppsindikator (eller vad en progress bar nu ska kallas på svenska). Känns lite som att man vill äta kakan och ha den kvar…
Ser nu att frågan är lite kryptiskt ställd, så det var nog ingen som förstod att det var en fråga över huvud taget…

Vad jag egentligen undrade var nog om man kan omdirigera till två ställen samtidigt, alltså dels till det här förloppsindikator-köret och dels till en fil, så att jag i efterhand kan söka igenom filen efter ordet "error" och på så vis få reda på om testet gick igenom eller inte.
Det är som sagt kommandot tee som används för att omdirigera samma sak till flera ställen. Men jag är inte riktigt med på varför du ska krånga till det på ett sånt sätt? Räcker det inte att skriptet tittar på returvärdet samtidigt som zenity får ta hand om utdatan?
Skriv svar

Återgå till "Terminalforum"