如何使用lockf命令运行eval?

如何使用lockf命令运行eval?

我有一个运行命令,eval如下所示。

#! /bin/sh

readonly scr="MYENV=1 sh /tmp/scr.sh"

eval ${scr} -a 1 -b 2

现在我想scr使用lockf实用程序运行脚本,因此我进行了以下更改:

#! /bin/sh

readonly scr="MYENV=1 sh /tmp/scr.sh"

lockf -k /tmp/f.lock eval ${scr} -a 1 -b 2

这会引发以下错误:

lockf: eval: No such file or directory

基本上,限制是MYENV=1运行命令时需要导出的内容(因此使用eval)。

我是 shell 编程的初学者,不确定如何解决这个问题。我该如何进行这项工作?

答案1

eval是一个 shell 内置的。一般来说,不鼓励使用它,因为很容易出错。

你可能只需要

#!/bin/sh
MYENV=1 lockf -k /tmp/f.lock sh /tmp/scr.sh -a 1 -b 2

答案2

readonly scr="MYENV=1 sh /tmp/scr.sh"
eval ${scr} -a 1 -b 2

在这里,你可能最好使用一个函数:

scr() {
    MYENV=1 sh /tmp/scr.sh "$@"
}
scr -a 1 -b 2

这仍然无法帮助运行它lockf,除非您执行诸如导出函数(在 Bash 中)之类的操作,然后运行lockf​​shell,以便该函数可用。

env您可以通过使用来设置变量来避免出现尴尬的赋值词。它是一个外部程序,因此也可用lockf。使用之前存储命令的方式:

readonly scr="env MYENV=1 sh /tmp/scr.sh"
$scr -a 1 -b 2
# or 
lockf -k /tmp/f.lock $scr -a 1 -b 2

但请注意,这不是存储命令的好方法,当您需要存储例如带有空格的文件名时,它会失败。更好的方法是使用数组(在 Bash/ksh/zsh 中):

scr=(env MYENV=1 sh /tmp/scr.sh)
"${scr[@]}" -a 1 -b 2
# or 
lockf -k /tmp/f.lock "${scr[@]}" -a 1 -b 2

看:我们如何运行存储在变量中的命令?

相关内容