[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
executed.

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
"DIRVISH_CLIENT is ${DIRVISH_CLIENT}";

(Notes:
	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:

DIRVISH_SERVER is
DIRVISH_CLIENT is

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
${DIRVISH_SERVER}"; echo "DIRVISH_CLIENT is ${DIRVISH_CLIENT}";'

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
"DIRVISH_CLIENT is ${DIRVISH_CLIENT}";'

(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:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=559660

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},
 			$cmd,
 			$A{log}
 		);
 	} else {
-		$rcmd = sprintf ("%s '%s %s' >>%s",
-			("$A{shell}" || "/bin/sh -c"),
+		$rcmd = sprintf ("%s %s '%s' >>%s",
 			$A{env},
+			("$A{shell}" || "/bin/sh -c"),
 			$cmd,
 			$A{log}
 		);


More information about the Dirvish mailing list