How to Mount/uMount with one Function

perhaps not really a complex function, but…

What I want to do:
I want a function that mounts a device if its unmounted and unmount the device if its already mounted. Seems to be Simple…
But I don’t know how to make this wiht only one function! I don’t know any way to make someting like if ( dev == mounted) {umount dev}

anybody an idea?

Greetings Arvodan

You want to do something like this:

DestroyFunc ToggleMount
AddToFunc ToggleMount
+ I PipeRead 'mount $0 || umount $0'

And call it with:

ToggleMount /mnt/some/mount-point


– Thomas Adam

Ah, thank you very much!

I really should work more wiht PipeRead…I acutally don’t really know what it makes…
It’s descript in the fvwm man page?


It is in the man page, yes. To quote it:

So it is a means of using the $SHELL to evaluate conditional commands, and generate Fvwm commands based on the output. A classic example is using PipeRead to generate dynamic menus. For instance I have a function which adds colorset information to a menu:

AddToFunc    FuncFvwmMenuColorset
+ I DestroyMenu recreate FvwmMenuColorset
+ I PipeRead 'echo "AddToMenu FvwmMenuColorset Colorsets Title"'
+ I PipeRead 'echo \+ \\"Reset\\" Function ChangeStyle "1 fg white, bg  #c06077";
  echo \\+ \\"\\" Nop'
+ I PipeRead 'while read l; do echo +\"${l/*bg /\ }\" Function ChangeStyle "$l";
 done < ~/.fvwm/colorsets'

You can do a lot with PipeRead, that’s for sure.

– Thomas Adam


so, this

does only send the command to the shell and the output isn’t used…
and the command it selfs is a logical OR (like in C/C++) so if mount $0 don’t work (because it’s already mounted) it’s 0 so he tries umount §0…
I’m right?


In this example, we’re not actually bothering with the output – fvwm makes no use of it. So what is run, is done at the $SHELL level. What happens is this:

+ I PipeRead 'mount $0 || umount $0'

$0 is a positional parameter for function – used in the context of FVWM only, in this instance. By positional, I mean it takes on whatever value was passed to the function. $0 is the first value.

So what happens is that when we invoke the function:

ToggleWindow /mnt/foo

$0 is replaced with /mnt/foo. When the function encounters a PipeRead, that simply passes the resulting command to the shell, expanding $0 as it goes, so that actually the shell sees:

mount /mnt/foo || umount /mnt/foo

And yes, && and || are conditional. They’re slightly different to how C/C++ uses them though. In bash, it works like this. Let’s use that mount command from earlier:

mount $0 || umount $0

“If the mount command fails (i.e., ‘||’), then do what is to the left of ‘||’”. Similarly you can negate that:

command && echo worked

… for instance says "if ‘command’ worked (&&) do what’s on the right (in which case that would print ‘worked’).

Note that this is to do more with shell semantics than it is with Fvwm… :slight_smile:

– Thomas Adam

ah! Thanks for the help!
I really should read the pages over the shell again…