制作一个打开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并执行命令

如何加速Cygwin?

如何在php中打开终端窗口并执行命令?

需要编写python脚本在cygwin中执行linux命令[关闭]

如何在Windows中通过Cygwin来使用Linux命令行

VS Code - Cygwin作为集成终端