制作一个打开3个cygwin终端并执行命令的脚本(windows)
Posted
技术标签:
【中文标题】制作一个打开3个cygwin终端并执行命令的脚本(windows)【英文标题】:Making a script which opens 3 cygwin terminals and executes the command (windows) 【发布时间】:2020-12-15 14:49:07 【问题描述】: 我想做什么:制作一个打开3个cygwin终端in windows的脚本,每个cygwin终端应该导航到特定目录并运行source .env
命令,然后运行npm start
目前我能做的是在 bat 脚本中执行命令:
终端 #1) cd C:\Users\Username\Desktop\node-service-1 && echo "source .env" && npm run start
终端 #2) cd C:\Users\Username\Desktop\node-service-2 && echo "source .env" && npm run start
3 号航站楼)cd C:\Users\Username\Desktop\node-service-3 && echo "source .env" && npm run start
相反,我想做同样的事情,但在 cygwin 中并保持 cygwin 处于打开状态。
原因是我不使用cygwin时source .env不起作用。
【问题讨论】:
请确认或修改:您是否正在运行像mintty
这样的终端仿真器和交互式bash
?并从那里你想执行一个bash
脚本来启动另外3 个具有单独启动目录的终端?在每个终端中,看起来你想运行bash
来解释.env
加上执行npm
作为子进程,对吧? npm
退出后每个 bash 和终端是否应该退出?
【参考方案1】:
您的基本问题是您想创建一个新的 bash 会话并最初运行一些设置命令,然后保持 bash 会话打开。您在此处的新终端中启动它并不是那么重要。
我会(错误地)使用你的~/.bashrc
和一个环境变量来传达是否启动服务,如果是,它是哪一个:在你的 .bashrc 末尾,做一个
if [[ -n $node_service ]]
then
ns_dir=/cygdrive/c/Users/Username/Desktop/node-service-$node_service
if [[ -d $ns_dir ]]
then
cd $ns_dir
echo source .env # What's the purpose of this?
npm run start
else
echo "ERROR: Directory '$ns_dir' does not exist"
fi
# Make sure that npm is not run again in a bash subshell
node_service=
fi
通过此设置,您可以编写 Windows 批处理脚本,执行以下操作:
set node_service=1
start c:\cygwin64\bin\mintty.exe /usr/bin/bash -l -i
对于每个节点。我在这里使用了 mintty 作为示例,但是您可以将其调整为您正在使用的任何终端程序。
【讨论】:
我试过这个,但是当我通过双击运行批处理脚本时,它只会打开终端并且不执行任何操作。打开终端后我应该在终端中输入一些内容吗? @MuhammadUsman :首先打开一个终端 cmd 窗口,然后输入我建议的批处理脚本。它至少应该输出一个有用的错误信息。您还可以执行/usr/bin/bash -l -i -x
,它应该可以跟踪 bash 在启动时执行的命令。
@MuhammadUsman :我刚刚验证过:至少使用mintty
,你不需要写start
。在我的系统上,和我们没有start
的效果是一样的,但是为了简单我建议你去掉。【参考方案2】:
您可以创建三 (3) 个文件。前两 (2) 个属于用户的 Cygwin 主目录。第三个,.bat 脚本,可以在任何地方。
=== ~/.env === C:\cygwin64\home\username\.env
export AVAR=something
=== ~/doit.bash === C:\cygwin64\home\username\doit.bash
cd $(cygpath -u $USERPROFILE)/Desktop/$1
echo source ~/.env
echo npm run start
=== trycyg.bat
FOR %%A IN (node-service-1 node-service-2 node-service-3) DO (
START "node1" "C:\cygwin64\bin\bash.exe" --login -i ~/doit.bash %%~A
)
【讨论】:
我试过这个,但每当我点击 trycyg.bat 时,它就会一直打开终端并立即关闭。然后我打开 cmd 并导航到 trycyg.bat 文件,然后尝试使用start trycyg.bat
打开然后它打开另一个 cmd,其中显示:``` C:\Users\Username\Desktop>FOR %A IN (node -service-1) DO (START "node1" "C:\cygwin64\bin\bash.exe" --login -i ~/doit.bash %~A ) C:\Users\Username\Desktop>(START "node1 " "C:\cygwin64\bin\bash.exe" --login -i ~/doit.bash node-service-1 ) C:\Users\Username\Desktop> ``` 然后什么都没发生【参考方案3】:
您可以在 test.sh 中保存以下脚本并运行它:
#!/usr/bin/env bash
cd C:/Users/Username/Desktop
for service in node-service-1 node-service-2 node-service-3; do
cd $service && cygstart bash -c "source .env && npm run start" && cd -
done
要进行故障排除,请运行以下命令:
cd C:/Users/Username/Desktop
cd node-service-1 && bash -c "source .env && npm run start" && cd -
【讨论】:
每当我尝试运行./test.sh
文件时,它只会打开一个终端并立即关闭。以上是关于制作一个打开3个cygwin终端并执行命令的脚本(windows)的主要内容,如果未能解决你的问题,请参考以下文章
如何在windows bat脚本中调用Cygwin并执行命令
需要编写python脚本在cygwin中执行linux命令[关闭]