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.

  • Flyswat@lemmy.dbzer0.com
    link
    fedilink
    arrow-up
    3
    ·
    10 months ago

    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?

    • linuxPIPEpower
      cake
      OP
      link
      fedilink
      arrow-up
      1
      ·
      10 months ago

      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.

    • linuxPIPEpower
      cake
      OP
      link
      fedilink
      arrow-up
      1
      ·
      10 months ago

      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 2>&1 tee. But I am not sure how it could be the right thing as I don’t see more than input?

      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".

      • yianiris@kafeneio.social
        link
        fedilink
        arrow-up
        1
        ·
        10 months ago

        @linuxPIPEpower

        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

      • yianiris@kafeneio.social
        link
        fedilink
        arrow-up
        1
        ·
        10 months ago

        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)”

        @linuxPIPEpower

  • bizdelnick@lemmy.ml
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    10 months ago

    Try something like IFS='|' read f1 f2 < <(zenity <...>) where f1, f2 etc. are variable names.

    • linuxPIPEpower
      cake
      OP
      link
      fedilink
      arrow-up
      1
      ·
      10 months ago

      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.