如何从环境变量运行命令并使内部尾随&符号起作用?

如何从环境变量运行命令并使内部尾随&符号起作用?

我有一个我称之为的小脚本prompt-to-run

prompt_acc=''

read -p 'run `'"$1"'`
' -i "$1" -e prompt_acc

$prompt_acc

它允许我创建一个脚本来填充命令,但让我有机会在不停止整个脚本的情况下编辑或跳过运行它。

我有一个不同的脚本,我们可以称之为long-running-script“我想运行”,我想在它自己的终端中运行,因为在接受一些输入后,它会坐在那里并连续输出更多文本。我希望能够从包含多个prompt-to-run调用的脚本开始运行它,然后返回我的原始终端,以便我可以运行下一个prompt-to-run调用。

我已经long-running-script在内部打开了一个新终端,因此手动输入

long-running-script &

启动我想要运行的程序并在原始终端中返回提示符。但prompt-to-run 'long-running-script &'不返回终端提示。我想这是因为该命令是从环境变量内部运行的,$prompt_acc所以它没有按照我想要的方式解释。

有没有办法改变其中之一或两者prompt-to-runlong-running-script得到我想要的东西?

答案1

您是对的,原因是它是从环境变量内部运行的。因此,整个后续文本(包括&)将作为参数传递给您的long-running-script.

解决方法是,将调用放在文件中$prompt_acc &而不是$prompt_accprompt-to-run文件中。这样,如果您决定不想运行该脚本,则&不会妨碍。

答案2

对变量扩展进行的唯一处理是分词和通配符扩展。其他 shell 元字符将被忽略。

如果您希望像键入命令一样执行变量的内容,请使用以下命令eval

eval "$prompt_acc"

这将执行命令的所有正常 shell 处理,包括引号处理、执行以 分隔的多个命令;、用 进行后台运行&、I/O 重定向等。

顺便说一句,prompt_acc这只是一个普通的 shell 变量,它不是一个环境变量。命令export是将变量放入环境中的方法。

相关内容