我执行了一个后台进程,该进程是作为参数获取的,执行后没有成功获得进程的名称。
我执行以下操作:
#! /bin/bash
filePath=$1
$filePath > log.txt &
echo `jobs -l`
实际结果:
[1]+ 2381 Running $filePath > log.txt &
预期结果:
[1]+ 2381 Running /home/user/Desktop/script.sh > log.txt &
答案 0 :(得分:2)
最佳答案是不要;作业控制是为交互使用而设计的功能,不能保证在非交互shell中根本无法使用作业控制,更不能保证以任何有用或有意义的方式进行操作。但是,如果您坚持要使用,可以使用printf %q
来生成带有变量后扩展形式的eval
安全的字符串,然后使用eval
将其作为代码运行:< / p>
#!/bin/bash
printf -v logfile_q '%q' "${log:-log.txt}" # use "$logfile", or default to log.txt
printf -v cmd_q '%q ' "$@" # quote our arguments into one eval-safe string
eval "$cmd_str >$logfile_q &" # Parts that aren't hardcoded must be printf-q'd for safety.
jobs -l
请注意,为了演示起见,我添加了一些额外的可配置性-将>log.txt
放入您的eval
代码中是可以的,但 并不安全>$logfile
,因为如果logfile=$'foo$(rm -rf ~)\'$(rm -rf ~)\''
(一个完全合法的文件名!),那么您将丢失主目录。因此,需要在eval
的参数内使用的任何变量都必须事先用printf %q
进行转义。