无需正确输入文件扩展名即可运行 bash 脚本

无需正确输入文件扩展名即可运行 bash 脚本

我在 Windows 10 上,决定从 cmd 过渡到 Git Bash。假设我有一个脚本foo.sh,我希望能够使用命令foo而不是运行它foo.sh。我发现这个答案,在某些情况下有效,但不是全部:

  1. 只有当脚本位于 PATH 中时,它才有效。如果它只是我当前目录中的脚本,则以下所有形式都不起作用:、、foo。唯一有效的方法是(所以我仍然必须输入扩展名)。我期望它能起作用,但我不知道为什么它不起作用。就好像在这种情况下命令未找到处理程序甚至没有运行一样。./foofoo.sh./foo.sh./foo

  2. 我发现cd在 bash 脚本中不起作用,您必须像这样获取脚本:. foo.sh。同样,我希望能够运行. foo

  3. 它在调用其他 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 定义一个 FTYPEftype bash.File=c:\somepath\bash.exe "%1" %*
  • 为 .sh 定义一个关联assoc .sh=bash.File

如同:https://stackoverflow.com/questions/9037346/making-python-scripts-run-on-windows-without-specifying-py-extension

答案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

事实上,这只是一个问题

  1. 确保你的脚本是 Bash 脚本,其第一行应该是#!/bin/bash
  2. 例如完全删除扩展mv ./script1.sh ./script1
  3. 使文件可执行,例如chmod 777 ./script1
  4. (可选)将脚本的目录包含在 PATH 中,例如export PATH="$HOME/my-scripts:$PATH"

如果您完成所有 4 个步骤,那么您可以从任何地方运行您的脚本script1

相关内容