我制作了一个 bash 脚本,其中包含以下内容:
#!/bin/bash
screen -dmS xccda "$(cd /root/constella && ./daemon.sh)"
screen -dmS xccwa "$(cd /root/constella && ./wallet.sh)"
screen -dmS xprda "$(cd /root/Prosus_Money && ./daemon.sh)"
screen -dmS xprwa "$(cd /root/Prosus_Money && ./wallet.sh)"
screen -dmS litda "$(cd /root/LithiumBit/build/release/src && ./daemon.sh)"
screen -dmS litwa "$(cd /root/LithiumBit/build/release/src && ./wallet.sh)"
screen -dmS lukada "$(cd /root/luka/cryptonote/build/release/src && ./daemon.sh)"
screen -dmS lukawa "$(cd /root/luka/cryptonote/build/release/src && ./wallet.sh)"
screen -dmS chaucha "$(cd /root/daemons/ && ./chauchad)"
screen -dmS litecoin "$(cd /root/daemons/litecoin-0.15.1/src && ./litecoind)"
我想要的是这个脚本在屏幕会话中运行这些脚本,但是当我运行我的脚本时,sh main.sh
或者./main.sh
它不会打开屏幕会话,这就是发生的情况
当单独运行时,每个 shell 脚本都像这样运行
答案1
让我们从脚本的前几行开始。这个问题影响到所有这些问题,但这里只处理一个问题会更容易。
#!/bin/bash screen -dmS xccda "$(cd /root/constella && ./daemon.sh)"
如果您将其声明为bash
脚本,请勿用于sh
运行它。要么设置权限并运行它,要么./main.sh
使用正确的 shell bash main.sh
。
现在,为什么脚本似乎挂起。会话screen
传递一个双引号字符串。简单地说,这意味着 shell 可以计算以 . 开头的表达式和变量$
。您已包含一条$( ... )
指令,该指令告诉 shell 执行其内容并用其写入的结果替换整个字符串标准输出。显然,要进行替换,命令必须完成。但你的没有。此外,无论如何你都不想要输出。
总之,
- 使用正确的 shell 解释器
- 不要在这里使用双引号 - 使用单引号,这样 shell 就不会解析内容
- 不要尝试评估该命令并使用其输出。只需执行即可。
这是修改后的脚本开头;请记住在整个过程中应用类似的更改:
#!/bin/bash
screen -dmS xccda 'cd /root/constella && ./daemon.sh'
答案2
screen -dmS xccda bash -c 'cd /root/constella && ./daemon.sh'