我有一个 Powershell 会话,它创建 bash 会话来运行这样的脚本
C:\msys64\usr\bin\bash -lc './super_duper_script.sh
其中 位于super_duper_script.sh
Powershell 会话的 cwd 中。不幸的是,当 bash 会话启动时,其 cwd 是“/home/username”,而不是 Powershell 会话的 cwd。
这是我到目前为止所做到的:
C:\msys64\usr\bin\bash -lc "cygpath -u '$PWD'"
回显 Powershell 会话的 cwd。现在的问题是,设置 bash 会话的 cwd 被证明是一个挑战。这只是我失败的两次尝试:
C:\msys64\usr\bin\bash -lc "env --chdir=(cygpath -u '$PWD')
C:\msys64\usr\bin\bash -lc "cd {cygpath -u '$PWD'}"
设置 .bashrc 不是一个选项,因为这个东西是在 CI 中运行的,而且可以在不同的目录中调用各种 bash 脚本。
由于您想要传递的工作目录信息属于 PowerShell 会话,并且在启动 Bash 时会丢失,因此您需要通过 PowerShell 捕获它。PowerShell
$PWD
变量以 Windows 路径的形式提供它,显然,在您的 Bash 环境中,该cygpath
命令会将 Windows 路径转换为 Bash 会话的相应路径。那么,请特别注意,这......依赖 PowerShell 扩展为 Bash 单引号字符串的内容,作为Bash 执行的命令
$PWD
的参数。cygpath
我想你已经知道了。这至少存在三个问题:
它缺少结束双引号。这可能只是问题中的一个拼写错误。
它没有指定要
env
运行的命令。可能这与结束双引号一起被意外截断似乎
(cygpath -u '$PWD')
是 Bash 命令替换(其中$PWD
已经由 PowerShell 扩展),但它的语法错误。我认为命令替换的 Bash 语法$(command ...)
与 PowerShell 的语法相同。看起来你想要的可能更像是这样的:
反引号 (`) 从 PowerShell 中转义以下内容
$
,但由于整个字符串是双引号的,PowerShell 仍将执行所需的$PWD
.但这是不必要的复杂。
env
当您可以这样做时,就无需参与:这让 Bash 像以前一样通过命令替换进行目录转换,然后切换到结果指定的目录,成功后,Bash 直接读取并执行脚本的内容(即不启动另一个 shell)。
我不确定那个人究竟想做什么。它们
{ ... }
对 PS 和 Bash 都有意义,但两者都没有赋予这种尝试对我有意义的意义。即使这样做了,也不会调用您最终想要运行的脚本。简单点,使用脚本的绝对路径
编辑
或者,您似乎知道该脚本位于当前目录中