在inittab中,尝试在执行脚本之前设置环境变量

在inittab中,尝试在执行脚本之前设置环境变量

在 inittab 中,我有一个如下所示的条目:

scpt:234:once:RSYNC_OPTIONS=-q /path/to/script/script.sh arg1 arg2 arg3 2>&1

但是,它失败了,因为它实际上正在尝试执行RSYNC_OPTIONS=-q.我也尝试过:

scpt:234:once:export RSYNC_OPTIONS=-q;/path/to/script/script.sh arg1 arg2 arg3 2>&1

但这也失败了。有办法做到这一点还是我必须修改脚本?

答案1

查看Linux sysvinit实现的源代码,当它看到shell特殊字符时,它确实会运行shell,但它会exec在字符串之前添加,这使得可以在参数中放置重定向和使用特殊字符,但不能设置环境变量这样。

  } else if (strpbrk(proc, "~`!$^&*()=|\\{}[];\"'<>?")) {
  /* See if we need to fire off a shell for this command */
        /* Give command line to shell */
        args[1] = SHELL;
        args[2] = "-c";
        strcpy(buf, "exec ");
        strncat(buf, proc, sizeof(buf) - strlen(buf) - 1);
        args[3] = buf;
        args[4] = NULL;

一个简单的解决方案是运行env.

scpt:234:once:env RSYNC_OPTIONS=-q /path/to/script/script.sh arg1 arg2 arg3 2>&1

一些可能的解决方法来说明如何运行任意命令:

scpt:234:once:>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3 2>&1
scpt:234:once:2>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3

相关内容