获取“ jobs -l”以显示实际命令,没有未扩展的变量

时间:2019-04-10 14:37:24

标签: bash shell

我执行了一个后台进程,该进程是作为参数获取的,执行后没有成功获得进程的名称。

我执行以下操作:

#! /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 &

1 个答案:

答案 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进行转义。