我正在使用 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