[Dirvish] pre & post scripts

Bjorn bl_dirvish at mblmail.net
Sun Oct 11 23:20:51 UTC 2015

There appears to be a bug with the way the pre- and post- scripts are

In subroutine scriptrun, a string is assembled with the shell invocation
(sh -c, by default), environment variables, command, and redirection.

The problem is that the environment variables are within the shell
invocation.  For example, if you to declare:

post-server: echo "DIRVISH_SERVER is ${DIRVISH_SERVER}"; echo

	Yes, you can try the above on any dirvish profile or vault that doesn't
already have a post-server statement.
	I've purposely used two distinct echo commands.  I just wanted to show
that my proposed solution works for multiple statements.)

You'll see in the resulting log file the following output:


The problem is that the environment variables (DIRVISH_SERVER,
DIRVISH_CLIENT, et al) are put after the /bin/sh -c invocation, not
before.  The resulting string is (using only a couple of environment
variables and omitting the redirection for illustration):

/bin/sh -c 'DIRVISH_SERVER=server.example.com
DIRVISH_CLIENT=client.example.com echo "DIRVISH_SERVER is

If you execute the above you will see it does not work as expected.  The
problem is that all the variables are expanded before execution of the
/bin/sh command.  Since the variables were not previously set, they
output as unset variables.

I believe the proper solution is to declare the variables before
invoking the shell.  So the example above would look like:

DIRVISH_SERVER=server.example.com DIRVISH_CLIENT=client.example.com
/bin/sh -c 'echo "DIRVISH_SERVER is ${DIRVISH_SERVER}"; echo

(You can also execute the above on a shell to see the results.)

Attached is the patch that I believe solves the problem; it merely
changes the placement of the $A{env} variable.

I noticed that quite some time ago, someone brought up the problem:

The proposed solution was to put the script commands in a separate file,
and execute that.  That does work as a work-around, but I believe it
would be better to fix the dirvish script.

The ordering of environment variables in front of the command is
described in the bash man page, under "Simple Commands."
-------------- next part --------------
--- /usr/sbin/dirvish	2015-09-25 07:40:13.496002276 -0700
+++ /usr/sbin/dirvish-debug	2015-10-11 14:54:20.319990631 -0700
@@ -929,16 +929,17 @@
 	$cmd = strftime($A{cmd}, localtime($A{now}));
 	if ($A{dir} =~ /^:/)
-		$rcmd = sprintf ("%s 'cd %s; %s %s' >>%s",
+		$rcmd = sprintf ("%s %s 'cd %s; %s' >>%s",
+			$A{env},
 			("$A{shell}" || "/bin/sh -c"),
-			$A{dir}, $A{env},
+			$A{dir},
 	} else {
-		$rcmd = sprintf ("%s '%s %s' >>%s",
-			("$A{shell}" || "/bin/sh -c"),
+		$rcmd = sprintf ("%s %s '%s' >>%s",
+			("$A{shell}" || "/bin/sh -c"),

More information about the Dirvish mailing list