如何让 bash 评估存储在变量中的 PM2 命令?

如何让 bash 评估存储在变量中的 PM2 命令?

我正在使用 cloud init 设置服务器配置,并在配置文件中一个接一个地运行命令。

我需要运行的设置服务器环境的命令之一是 PM2,以便在重启后保持节点服务器应用程序在线。我可以让 PM2 输出我需要运行的特殊命令,并将该命令存储在变量中以在下一行运行。

命令 1:(存储输出)

pm2response=$(pm2 startup systemd)

命令2:(执行响应命令并修剪多余的日志)

${pm2response#*Execute the following command:}

当我在游乐场服务器中运行命令 2 时,它输出错误

[PM2][ERROR] Init system not found

我不明白为什么我不能将命令输出存储在变量中并执行该变量。我已手动将需要运行的确切命令复制到控制台中并成功执行。它只是将其存储在不起作用的变量中。

我需要作为变量执行的命令:(此操作成功)

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username

我尝试作为变量执行的命令:(有错误)

var='sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username'
$var

这为什么不起作用?

更新

我在我的服务器中使用双引号使 $var 工作。

var="sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username"
$var #works!

虽然这只是我在游乐场服务器中测试的一个例子。为了清楚起见,我实际上试图评估命令 2:

${pm2response#*Execute the following command:}

命令 2 的参考:我使用 shell 参数替换,因此可以删除日志记录。这是没有使用 shell 参数替换的输出。

echo $pm2response: (将输出)

[PM2] Init System found: systemd [PM2] You have to run this command as root. Execute the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username

因此通过添加 shell 参数替换,
echo ${pm2response#*Execute the following command:}:(将输出)

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username

答案1

尝试以下任一方式:

var="sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username"

$var

var1=$("sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username")

$var1

您使用的错误是因为表达式没有在单引号中扩展,因此请使用双引号:

var='sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username'
$var

相关内容