我有一个我称之为的小脚本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-run
或long-running-script
得到我想要的东西?
答案1
您是对的,原因是它是从环境变量内部运行的。因此,整个后续文本(包括&
)将作为参数传递给您的long-running-script
.
解决方法是,将调用放在文件中$prompt_acc &
而不是$prompt_acc
在prompt-to-run
文件中。这样,如果您决定不想运行该脚本,则&
不会妨碍。
答案2
对变量扩展进行的唯一处理是分词和通配符扩展。其他 shell 元字符将被忽略。
如果您希望像键入命令一样执行变量的内容,请使用以下命令eval
:
eval "$prompt_acc"
这将执行命令的所有正常 shell 处理,包括引号处理、执行以 分隔的多个命令;
、用 进行后台运行&
、I/O 重定向等。
顺便说一句,prompt_acc
这只是一个普通的 shell 变量,它不是一个环境变量。命令export
是将变量放入环境中的方法。