我想知道 Windows 环境变量是否有一个 Unix 等效项PATHEXT
。
对于没有 Windows 背景的用户:添加文件后缀 可以PATHEXT
让我执行脚本,而无需在 cmd.exe 中键入该后缀。例如,在我的 Windows 计算机上,PATHEXT 包含后缀.pl
,当我想在 cmd.exe 中执行 Perl 脚本时,我只需键入即可my-script
执行。然而,为了在 bash 中执行相同的脚本,我需要编写全名:my-script.pl
。
由于我目前在 Windows 和 Unix 上工作,当我再次进入 Unix 机器时,我几乎总是陷入忘记输入后缀的陷阱。
答案1
最简单的解决方案是不使用脚本扩展。它们不是必需的,仅用于向您识别脚本的类型,而不是向计算机识别脚本的类型。虽然 Windows 使用扩展名来识别文件类型,但 *nix 系统(除了极少数例外,例如gzip
)不这样做。
请注意,二进制文件在 *nix 中没有.exe
扩展名,它们只是称为foo
,而不是foo.exe
。因此,如果您希望foo.pl
可执行文件为,只需首先foo
将文件保存为。foo
或者,如果您出于某种原因确实需要扩展,请进入保存脚本的目录并运行以下命令:
for f in *.*; do ln -s "$f" "${f%%.*}"; done
这将迭代所有具有扩展名的文件,并且对于其中的每个文件foo.ext
,将创建一个名为 的链接,foo
该链接指向foo.ext
.请注意,如果您有多个具有相同名称但扩展名不同的脚本,则此操作将会失败。
答案2
如果你真想做的话,还是有办法的。.bashrc
在主目录的末尾添加以下内容,并将扩展名设置PATHEXT
为以点分隔的扩展名:
。 (已更改为包含点以匹配 Windows 行为。)使用它的风险由您自行承担。
if declare -f command_not_found_handle >/dev/null; then
eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
local PATHEXT_EXPANDED i
IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
for i in "${PATHEXT_EXPANDED[@]}"; do
if type "$1$i" &>/dev/null; then
"$1$i" "${@:2}"
return $?
fi
done
if declare -f original_command_not_found_handle >/dev/null; then
original_command_not_found_handle "$@"
else
return 127
fi
}
另请记住,如果没有其他命令也以 开头,则可以使用 Tab 来完成命令名称my-script
。
答案3
短:无
更长:shell 脚本需要完整的文件名,但您可以为命令定义别名以通过各种名称引用它们。例如
alias my-script=my-script.pl