[gelöst] pause command in while do funktioniert nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

[gelöst] pause command in while do funktioniert nicht

Beitrag von joe2017 » 07.08.2020 15:26:00

Guten Tag liebe scripter,

kann es sein, dass in einer while do schleife ein pause Kommando nicht unterstützt wird?

Code: Alles auswählen

while IFS=, read var1 var2
do
  if echo "$var1" | grep 'search text'; then
    sudo command && pause
  fi
done < /path/file.csv
Wenn ich ein sleep einbaue funktioniert das:

Code: Alles auswählen

while IFS=, read var1 var2
do
  if echo "$var1" | grep 'search text'; then
    sudo command && sleep 3
  fi
done < /path/file.csv
Gibt es hierfür eine andere Syntax?

Danke und ein schönes Wochenende
Zuletzt geändert von joe2017 am 10.08.2020 09:10:36, insgesamt 1-mal geändert.

DeletedUserReAsG

Re: pause in while do funktioniert nicht

Beitrag von DeletedUserReAsG » 07.08.2020 15:29:44

Code: Alles auswählen

$ pause
bash: pause: Kommando nicht gefunden.
Es gibt ein Binary namens pause in Debiandialog – meintest du das?

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: pause in while do funktioniert nicht

Beitrag von joe2017 » 07.08.2020 15:34:34

Ahhh entschuldige! :facepalm:
Ich war gerade mit dem Kopf bei Microsoft. Hier gibt es ein "pause" Kommando.

In meinem bash Script habe ich eine Funktion "pause"

Code: Alles auswählen

pause(){
  read -p "Press [Enter] key to continue..." fackEnterKey
}
Die Funktion wird jedoch in meiner while Schleife nicht ausgeführt?
Wenn ich jedoch am Ende der Schleife die Funktion aufrufe funktioniert diese.

Code: Alles auswählen

while IFS=, read var1 var2
do
  if echo "$var1" | grep 'search text'; then
    sudo command
  fi
done < /path/file.csv
pause

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: pause in while do funktioniert nicht

Beitrag von JTH » 07.08.2020 15:45:24

joe2017 hat geschrieben: ↑ zum Beitrag ↑
07.08.2020 15:34:34

Code: Alles auswählen

while read var1 var2
do
  […]
  read fackEnterKey
  […]
done < /path/file.csv
Aufs wesentliche runtergebrochen. Das funktioniert so nicht, wie du willst. Beide reads lesen aus dem CSV. Die Input-Umleitung

Code: Alles auswählen

< /path/file.csv
gilt für alles innerhalb der Schleife.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: pause in while do funktioniert nicht

Beitrag von joe2017 » 07.08.2020 15:49:24

Hi JTH,

das werde ich gleich am Montag mal testen.
Danke auf jeden Fall für den Tipp.

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: pause in while do funktioniert nicht

Beitrag von JTH » 07.08.2020 15:58:59

Und als Nachtrag: Du kannst den Filedescriptor 0 (stdin) vor der Schleife kopieren, dann sollte das funktionieren, wie dus vorhast (grob aus dem Kopf):

Code: Alles auswählen

exec 3<&0 # Kopiert FD 0 nach FD 3

while read var; do
    read -p "Press Enter!" blab <&3
done <some.csv

exec 3<- # FD 3 wieder schließen
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: pause in while do funktioniert nicht

Beitrag von tobo » 07.08.2020 16:32:29

Vielleicht eher pause anpassen:

Code: Alles auswählen

pause(){
  read -u1 -p "Press [Enter] key to continue..." fackEnterKey
}

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: pause in while do funktioniert nicht

Beitrag von joe2017 » 10.08.2020 09:10:09

Guten Morgen tobo,

das hat bestens funktioniert.
Was genau bewirkt das "-u1"? Damit ich das verstehe und in Zunkunft anwenden kann.

Vielen Dank für alle Ideen!

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: pause in while do funktioniert nicht

Beitrag von MSfree » 10.08.2020 09:31:42

joe2017 hat geschrieben: ↑ zum Beitrag ↑
10.08.2020 09:10:09
Was genau bewirkt das "-u1"?
siehe

Code: Alles auswählen

man bash
ungefähr um die Zeile 3700.

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: [gelöst] pause command in while do funktioniert nicht

Beitrag von tobo » 10.08.2020 09:51:36

Da (das verwendete) read ein Bash-Builtin ist, kann man mittels

Code: Alles auswählen

help read
besser Informationen erfragen. Inhaltlich werde ich dazu aber später noch was schreiben, denn ich bin mir ziemlich unsicher, ob das wirlich so toll ist, kann das im Moment aber noch nicht untermauern.

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: [gelöst] pause command in while do funktioniert nicht

Beitrag von joe2017 » 10.08.2020 10:28:35

Alles klar. Vielen Dank! :THX:

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: [gelöst] pause command in while do funktioniert nicht

Beitrag von tobo » 10.08.2020 14:24:02

Habe das jetzt mal anhand dieses Textes getestet:

Code: Alles auswählen

#exec 3<&0; fd=3                
fd=1

pause(){
    read v <& $fd               ## entspricht read -u $fd v
}

[ -e FILE ] || printf "1\n2,a\n3,b,c\n4,d\n5\n" > FILE

pid="$$"; printf "${pid}\n"     ## ls /proc/${pid}/fd

while IFS=, read var1 var2; do
    printf "${var1}\n${var2}\n"
    pause
done < FILE
Der Punkt, der mich störte, war die mehrfache Verwendung der Standardausgabe (0=Standardeingabe stdin, 1=Standardausgabe stdout, 2=Standardfehlerausgabe stderr). Hat am Freitag, auch nach relativ ausgiebigen Tests, reibungslos funktioniert. Trotzdem sieht das falsch aus bzw. fühlt sich falsch an, die vorbelegten Dateideskriptoren, ohne Übergabe, einfach anderweitig zu gebrauchen. Und ehrlich gesagt, mir ist auch nicht ganz klar, wieso das so geräuschlos funktioniert!? Aber das tut es und zwar als Skriptparameter mit vorgesetztem bash, mksh und sh (dash) in allen Fällen. Ist also auch kein Feature z.B. der Bash. Man kann stdout weiterhin fehlerlos benutzen (vor, während oder nach der Schleife; in oder außerhalb der Funktion), mit allen drei getesteten Shells, so als hätte die Übergabe überhaupt keine Auswirkung darauf!?

Dennoch - intuitiv ist diese Vorgehensweise trotzdem falsch. Von der Logik her besser den FD umlenken, dazu einfach die Kommentierung der ersten beiden Skiptzeilen umkehren. Den Dateideskriptor 3 könnte man dann noch am Skriptende (mittels trap) löschen, aber die Eltern-ID (PPID) weiß eh nichts davon; spielt also keine Rolle.
Vielleicht kann ja sonst wer zur Thematik noch erhellend beitragen?!

Antworten