我有一个运行命令,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