我在 Windows 10 上,决定从 cmd 过渡到 Git Bash。假设我有一个脚本foo.sh
,我希望能够使用命令foo
而不是运行它foo.sh
。我发现这个答案,在某些情况下有效,但不是全部:
只有当脚本位于 PATH 中时,它才有效。如果它只是我当前目录中的脚本,则以下所有形式都不起作用:、、
foo
。唯一有效的方法是(所以我仍然必须输入扩展名)。我期望它能起作用,但我不知道为什么它不起作用。就好像在这种情况下命令未找到处理程序甚至没有运行一样。./foo
foo.sh
./foo.sh
./foo
我发现
cd
在 bash 脚本中不起作用,您必须像这样获取脚本:. foo.sh
。同样,我希望能够运行. foo
。它在调用其他 bash 脚本的 bash 脚本中不起作用。
所以我的问题是如何摆脱输入 .sh 的需要到处,而不只是在特定情况下。
编辑:因为我被问到,所以我的机器上的输出assoc .sh
是:
.sh=sh_自动文件
输出为ftype sh_auto_file
:
sh_auto_file="C:\Program Files\Git\git-bash.exe" --no-cd "%L" %*
答案1
这需要几个步骤。
- 添加
.sh
到 PATHEXT 环境变量 - 为 .sh 定义一个 FTYPE
ftype bash.File=c:\somepath\bash.exe "%1" %*
- 为 .sh 定义一个关联
assoc .sh=bash.File
答案2
Bash 需要明确的文件名,这就是为什么你需要执行这样一个难以理解的解决方法。它还区分大小写,除非对 Windows 环境有特殊考虑。
您试图做的是将 Windows 简写强行塞入 Unix shell 中,而它根本不存在。除了您信任的用例之外,它还存在安全风险,例如,foo.exe 可能会被放入 PATH 中并优先处理。
我解决这个问题的方法是养成一个习惯,即为所有可执行的 shell 脚本命名时不带扩展名,为所有不可执行的脚本(例如包含或依赖的脚本)命名时带扩展名。这还有一个好处,就是当有类似、可完成名称的文件时,更容易用 tab 键完成,因为没有扩展名就已经很明确了。
答案3
正如@uSlacr指出,有三个步骤。
您可以.BAT
在管理命令提示符中运行此文件来执行这些操作
:: Make .sh and .bash files executable without extension
:: Append .sh to PATHEXT
setx PATHEXT "%PATHEXT%;.SH;.BASH" /M
:: Define an FTYPE
FTYPE bash.File="C:/Program Files/Git/bin/bash.exe" "%%1" %%*
:: Define ASSOC for that FTYPE
ASSOC .sh=bash.File
ASSOC .bash=bash.File
bash 的路径因你安装 git-for-windos 的方式而异。你可以.bat
使用以下命令在 bash 中生成文件
#!/bin/bash
bash_location="$(git --exec-path |
sed 's@\(.*Git/\).*@\1bin/bash.exe@')"
printf '%s' ':: Make .sh and .bash files executable without extension
:: Append .sh to PATHEXT
setx PATHEXT "%PATHEXT%;.SH;.BASH" /M
:: Define an FTYPE
FTYPE bash.File="'"$bash_location"'" "%%1" %%*
:: Define ASSOC for that FTYPE
ASSOC .sh=bash.File
ASSOC .bash=bash.File
' > exec-sh-ext.bat
答案4
事实上,这只是一个问题
- 确保你的脚本是 Bash 脚本,其第一行应该是
#!/bin/bash
- 例如完全删除扩展
mv ./script1.sh ./script1
- 使文件可执行,例如
chmod 777 ./script1
- (可选)将脚本的目录包含在 PATH 中,例如
export PATH="$HOME/my-scripts:$PATH"
如果您完成所有 4 个步骤,那么您可以从任何地方运行您的脚本script1
。