[gelöst] yad Dialog: Textformatierung mit Variable

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
detix
Beiträge: 1705
Registriert: 07.02.2007 18:51:28
Wohnort: MK

[gelöst] yad Dialog: Textformatierung mit Variable

Beitrag von detix » 24.03.2024 11:20:41

Ich möchte einen Hinweistext ‒ der mehrfach in einem Skript vorkommt ‒ einheitlich formatieren.
Es funktioniert eigentlich auch bis auf „--fontname=...”
für diesen Parameter muss ich eine 2te Variable benutzen, zB:

Code: Alles auswählen

yadP1="--no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info"
yadP2=--fontname="Monospace bold 12"
yad "$yadP2" $yadP1 <<<"So funktioniert mein Vorhaben perfekt"
Wie bekomme ich $yadP2 unfallfrei in $yadP1 integriert, würde halt gern auf eine 2te Variable verzichten.
Zig Versuche mit „'\"...” in doppelter oder 3facher Angabe (Leerzeichenproblem?) führen leider nicht zum Erfolg.
Zuletzt geändert von detix am 24.03.2024 13:48:02, insgesamt 1-mal geändert.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

juribel
Beiträge: 188
Registriert: 20.06.2023 10:17:01

Re: yad Dialog: Textformatierung mit Variable

Beitrag von juribel » 24.03.2024 12:45:21

Code: Alles auswählen

  P="--fontname='Monospace bold 12' --no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info" 
  yad $P <<<"So funktioniert mein Vorhaben perfekt" 
Doppelte Anführungszeichen innerhalb von doppelten Anführungszeichen können nicht funktionieren.

juribel
Beiträge: 188
Registriert: 20.06.2023 10:17:01

Re: yad Dialog: Textformatierung mit Variable

Beitrag von juribel » 24.03.2024 13:03:31

Sorry, funktioniert doch nicht wie gewünscht :-(

Benutzeravatar
detix
Beiträge: 1705
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: yad Dialog: Textformatierung mit Variable

Beitrag von detix » 24.03.2024 13:08:29

Hattest du das selbst so probiert?
Die Textfarbe ist wohl grün aber der Font ist hier weder bold noch 12p...
funktioniert leider nicht, aber danke fürs Testen.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: yad Dialog: Textformatierung mit Variable

Beitrag von heisenberg » 24.03.2024 13:12:01

Vielleicht als Array (ungetestet) ?

Code: Alles auswählen

set -x # set -x ist immer gut zum debuggen
yadP1=(--no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info)
yadP2=(--fontname="Monospace bold 12")
yad "${yadP2[@]}" "${yadP1[@]}" <<<"So funktioniert mein Vorhaben perfekt"
Zuletzt geändert von heisenberg am 24.03.2024 13:15:12, insgesamt 2-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
detix
Beiträge: 1705
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: yad Dialog: Textformatierung mit Variable

Beitrag von detix » 24.03.2024 13:14:03

Hoppala, falschen Knopp gedrückt, aus Versehen juribels Post gemeldet, Entschuldigung!
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
detix
Beiträge: 1705
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: yad Dialog: Textformatierung mit Variable

Beitrag von detix » 24.03.2024 13:24:23

heisenberg hat geschrieben: ↑ zum Beitrag ↑
24.03.2024 13:12:01

Code: Alles auswählen

set -x # set -x ist immer gut zum debuggen
yadP1=(--no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info)
yadP2=(--fontname="Monospace bold 12")
yad "${yadP2[@]}" "${yadP1[@]}" <<<"So funktioniert mein Vorhaben perfekt"
So funktionierts ja auch, nur wie bekomme ich den Font mit in $yadP1, ohne $yadP2 zu bemühen?
Es ist kein großes Thema, wenns nur mit einer 2ten Variable funktioniert dann ist das eben so,
nur erschließt sich mir hier nicht der Grund dafür.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

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

Re: yad Dialog: Textformatierung mit Variable

Beitrag von tobo » 24.03.2024 13:32:23

Durch Zusammenschreiben?

Code: Alles auswählen

$ param=(--no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info --fontname="Monospace bold 12")
$ yad "${param[@]}" <<< "So funktioniert mein Vorhaben perfekt"

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: yad Dialog: Textformatierung mit Variable

Beitrag von heisenberg » 24.03.2024 13:34:19

Vielleicht so?

Code: Alles auswählen

set -x # set -x ist immer gut zum debuggen
yadP2=(--fontname="Monospace bold 12")
yadP1=( "${yadP2[@]}" --no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info)
yad "${yadP1[@]}" <<<"So funktioniert mein Vorhaben perfekt"
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
detix
Beiträge: 1705
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: yad Dialog: Textformatierung mit Variable

Beitrag von detix » 24.03.2024 13:46:57

tobo hat geschrieben: ↑ zum Beitrag ↑
24.03.2024 13:32:23
Durch Zusammenschreiben?
Ja, so funktionierts ‒ mit einem array! ‒ vielen Dank an die Beteiligten.
Warum es nicht anders geht bleibt leider offen, dennoch gelöst!
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: yad Dialog: Textformatierung mit Variable

Beitrag von Livingston » 24.03.2024 19:01:18

detix hat geschrieben: ↑ zum Beitrag ↑
24.03.2024 13:46:57
Warum es nicht anders geht bleibt leider offen, dennoch gelöst!
Hier auf https://mywiki.wooledge.org/BashFAQ/050 gibt's eine Erklärung. Etwas mehr Details dazu: https://mywiki.wooledge.org/WordSplitting

Das komplette Wiki gefällt mir übrigens ganz gut. Wenn ich mal mit der Bash auf Kriegsfuß stehe, schaue ich da gerne rein.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

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

Re: [gelöst] yad Dialog: Textformatierung mit Variable

Beitrag von tobo » 24.03.2024 19:03:58

detix hat geschrieben: Warum es nicht anders geht bleibt leider offen, dennoch gelöst!
Das Problem ist die Auswertung durch die Shell, weil die Single-Quotes innerhalb der Variable literal betrachtet werden und das Wordsplitting am Leerzeichen trennt. Ein vorgestelltes `set -x' zeigt das Problem (Paramter --fontname=... und die zusätzlich hinzugefügten Leerzeichen vor --undecorated) ganz gut:

Code: Alles auswählen

$ set -x
$ param="--no-buttons    --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info --fontname='Monospace bold 12'"
 ## 56 : param='--no-buttons    --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info --fontname='\''Monospace bold 12'\'''
$
$
$ yad "$param" <<< "So funktioniert mein Vorhaben perfekt"
 ## 57 : yad '--no-buttons    --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info --fontname='\''Monospace bold 12'\'''
$ ## bzw.
$ yad $param <<< "So funktioniert mein Vorhaben perfekt"
 ## 58 : yad --no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info '--fontname='\''Monospace' bold '12'\'''
$
Ungehen könnte man das (neben dem Array) mit eval. Damit wird die Kommandozeile zweimal von der Shell gelesen, beim zweiten Mal mit den ausgewerteten Argumenten des ersten Mals:

Code: Alles auswählen

$ eval yad "$param" <<< "So funktioniert mein Vorhaben perfekt"
 ## 59 : eval yad '--no-buttons    --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info --fontname='\''Monospace bold 12'\'''
  ## 59 : yad --no-buttons --undecorated --timeout=5 --fore=green --wrap --width=250 --justify=center --text-info '--fontname=Monospace bold 12'
$ 
Wobei eval aber auch Probleme sicherheitstechnischer Art machen kann.

Ein einfaches Beispiel, was das Problem ebenfalls zeigt, aber lesbar ist:

Code: Alles auswählen

$ touch "file 1"
 ## 31 : touch 'file 1'
$ touch "file 2"
 ## 32 : touch 'file 2'
$ files="'file 1' 'file 2'"
 ## 33 : files=''\''file 1'\'' '\''file 2'\'''
$ ls $files
 ## 34 : ls ''\''file' '1'\''' ''\''file' '2'\'''
ls: cannot access "'file": No such file or directory
ls: cannot access "1'": No such file or directory
ls: cannot access "'file": No such file or directory
ls: cannot access "2'": No such file or directory
$ ls "$files"
 ## 35 : ls ''\''file 1'\'' '\''file 2'\'''
ls: cannot access "'file 1' 'file 2'": No such file or directory
$ eval ls "$files"
 ## 36 : eval ls ''\''file 1'\'' '\''file 2'\'''
  ## 36 : ls 'file 1' 'file 2'
'file 1'  'file 2'
$

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] yad Dialog: Textformatierung mit Variable

Beitrag von heisenberg » 24.03.2024 21:52:54

IMHO: Finger weg von eval!

Das macht alles nur komplizierter und demzufolge anfälliger. Probleme mit meinen Scripten waren regelmäßig auf die nicht ausreichend achtsame Verwendung von eval zurück zu führen. Seit einiger Zeit verzichte ich da lieber komplett darauf. Es gibt immer andere und bessere Möglichkeiten.

Aber natürlich darf da jeder seine eigenen Erfahrungen sammeln.

Mir persönlich geht es dabei eher weniger um das Thema Sicherheit - wer sicheren Code möchte ist bei bash IMHO falsch - sondern eher um robusten und leicht verständlichen Code.

Siehe auch:
The Perils of Bash 'eval'
Why should eval be avoided and what to use instead?
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: [gelöst] yad Dialog: Textformatierung mit Variable

Beitrag von Livingston » 25.03.2024 00:09:28

Die Aussage "eval is evil" finde ich ein wenig reißerisch. Ich kann immer einen Weg finden, mir ins eigene Knie zu schießen, sei es in C mit system("/usr/bin/rm IrgendEinUserInput"); oder in Bash mit eval ${WasSollDaSchonSchiefGehen}.
Wenn man weiß, was eval tut, wird man niemals einen ungecheckten String darauf loslassen.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Antworten