Ren*_*ger 12 shell environment-variables
我想知道是否有 Windows 环境变量的 Unix 等效项PATHEXT
。
对于那些没有 Windows 背景的人:添加文件后缀以PATHEXT
允许我执行脚本而无需在 cmd.exe 中键入该后缀。例如,在我的 Windows 计算机上,PATHEXT 包含后缀.pl
,当我想在 cmd.exe 中执行 Perl 脚本时,我只需键入my-script
即可执行。然而,为了在 bash 中执行相同的脚本,我需要写全名:my-script.pl
.
由于我目前同时在 Windows 和 Unix 上工作,我几乎总是陷入再次进入 Unix 框时忘记键入后缀的陷阱。
ter*_*don 13
最简单的解决方案是不要为您的脚本使用扩展。它们不是必需的,仅用于向您识别脚本的类型,而不用于识别计算机。虽然 Windows 使用扩展名来标识文件类型,但 *nix 系统(极少数例外,例如gzip
)不这样做。
请注意,二进制文件.exe
在 *nix 中没有扩展名,它们只是被称为foo
,而不是foo.exe
. 因此,如果您想foo.pl
以 可执行文件foo
,只需将文件另存为foo
。
或者,如果您出于某种原因确实需要扩展,请进入您保存脚本的任何目录并运行以下命令:
for f in *.*; do ln -s "$f" "${f%%.*}"; done
Run Code Online (Sandbox Code Playgroud)
这将遍历所有带有扩展名的文件,并且对于其中的每个文件foo.ext
,将创建一个名为的链接,该链接foo
指向foo.ext
. 请注意,如果您有多个名称相同但扩展名不同的脚本,这将失败。
短:没有
更长:shell 脚本需要完整的文件名,但您可以为命令定义别名,以通过各种名称引用它们。例如
alias my-script=my-script.pl
Run Code Online (Sandbox Code Playgroud)
如果你真的想做,有办法。.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
}
Run Code Online (Sandbox Code Playgroud)
还请记住,如果没有其他命令也以my-script
.