I am learning some bash scripting.
I am interested to learn about getting input for my scripts via a GUI interface. It seems that yad
(forked from zenity
) is the most robust tool for this. (But if there is a better choice I would like to hear about it too.)
Is it possible to obtain 2 or more named variables using yad
? Not just getting the values based on their positions ($1
, $2
, etc), with awk
. See “What doesn’t work” spoiler for those.
What doesn't work
I find how to obtain one named variable, for example:
inputStr=$(zenity --entry --title="My Title" --text="My Text:")
I also find solutions relying on opening single-variable dialogues sequentially but that’s a terrible interface.
Everything else relies on chopping up the output with awk
or based on the positions, $1
, $2
, $3
etc. In this script $jpgfile
is obtained:
jpgfile=$(echo $OUTPUT | awk 'BEGIN {FS="," } { print $1 }')
This seems unmanageable because adding a new field or failing to provide input for a field will both change the output order of every subsequent value. It’s way too fragile.
For a simple example, I want to ask the user for a file name and some content. Creating the dialogue is like this:
yad --title "Create a file" --form --field="File name" --field="Content"
If you fill both fields the output in the terminal is file|this is some text|
. How do I get them into variables like $filename
and $filecontent
? So then I can finish the script like this:
touch "$filename"
echo "$filecontent" > $filename
Is this possible??? I do not find it anywhere. I looked though all kinds of websites like YAD Guide, yad man page, smokey01. Maybe I missed something. On yaddemo I read about bash arrays and it seemed to come close but I couldn’t quite piece it together.
If you fill both fields the output in the terminal is
file|this is some text|
Wouldn’t it be easy to get them using awk by defining
|
as a field separator?It is the only solution I found. I described it in the post but put it behind a “spoiler” “What doesn’t work” to make the post shorter.
This seems unmanageable because adding a new field or failing to provide input for a field will both change the output order of every subsequent value. It’s way too fragile.
Did I miss what you are asking or is this it?
cat /etc/mtab 2>&1 | tee /tmp/tab.txt | yad --title=“output” --width=154 \
--text="$(cat /tmp/tab.txt)grep sda /etc/mtab 2>&1 tee /tmp/tab.txt | yad --title=“output” \ --width=154 --text=“$(cat /tmp/tab.txt)”
I’m not sure if that is working properly on my system. It opens a dialogue box that just has content
""
with cancel/ok buttons .I tried populating a file tab.txt with a few lines because I am not sure if my results from the first part are what’s expected, which is 1 line. No matter what the content the best I can do is get the first line to show in the dialogue but not in an interactive way.
Tbh having a bit of a hard time following what’s going on with
&1 tee
. But I am not sure how it could be the right thing as I don’t see more thaninput
?What I want is to open a dialogue like this:
yad --title "Create a file" --form --field="File name" --field="Content
where the user’s input gets directed to some sort of structure. Like an argument As though you had a terminal script with the syntax
scriptname --filename="file.txt" --content="red green blue"
.2>&1 sends error output to standard output which can be sent to a file, not all output you see on screen can do that.
You can use buttons and for each one it will execute a specific command, you add text to describe the button, and that is as far as yad will take you.
From system to system and from shell to shell expect some commands to work differently, I am using zsh on an arch based system called joborun
tee also varies substitute >
also for nvme you have no sda
I got the problem, some yad syntax when run as a command in bash it is read as bash script, take it, put it in a file, then run the file as script.
Too many quotes in it for bash to leave unnoticed :)
yad --title=“output of command in yad " --width=350 --height=82 --text-align=left --text=”$(grep a /etc/fstab)"
grep ext /etc/fstab > /tmp/zz
yad --title=“output of file in yad box” --width=350 --height=82 --text-align=left --text=“$(cat /tmp/zz)”
Try something like
IFS='|' read f1 f2 < <(zenity <...>)
where f1, f2 etc. are variable names.If you leave some of the field blank will it be able to skip assigning the respective variable? That’s one problem with the positional values.
I have an array based solution but it doesn’t solve the cases of changing the order or empty fields.