如何在 MacOS 的每个 shell 脚本中删除“./”的需要?

How to remove the need of "./" in every shell script in MacOS?

我正在研究 shellscript,我知道有一种方法可以在需要执行 shellscript 时跳过“./”。 例如:在我制作了这样的脚本之后:

echo "hello world!"

我使用命令“chmod +X”使其可执行。但是要在我的终端上执行它,我需要输入:

./helloworld.sh

我知道如果您使用 bash,有一种方法可以跳过这个“./”。您转到 .bashrc 并在脚本末尾写入“PATH=PATH:”。 但是由于我使用的是使用 zsh 的 MacOS,所以我尝试输入“PATH=PATH:”。在我的 .zshrc 末尾,但这没有用。 然后我想知道是否有一种方法可以消除我需要 运行.

的每个 shellscript 对“./”的需求

谢谢大家

P.S.: 我的机器上安装了 brew 和 ohmyzsh

您需要 PATH=$PATH:. -- $ 来扩展 PATH 的(旧)值很重要。

你的代码有什么问题

你的例子不起作用的原因是因为 PATH 是一个变量,你需要通过在它前面加上美元符号来访问它的值来扩展它,例如PATH=$PATH:. 而不仅仅是 PATH=PATH:.。但是,还有其他一些注意事项。

前置、附加和导出 PATH

出于安全原因,通常不建议将当前工作目录视为 PATH 的一部分,但您可以在任何 Bourne-like shell 通过在您的 PATH 前添加或附加 .(这意味着任何当前工作目录)。根据调用它的位置以及初始化 shell 的方式,您可能还需要将 PATH 变量导出到您的环境中。

一些示例包括:

# find the named executable in the current working directory first
export PATH=".:$PATH"

# find the named executable in the current working directory
# only if it isn't found elsewhere in your PATH
export PATH="$PATH:."

# append only the working directory you're currently in when you
# update the PATH variable, rather than *any* current working 
# directory, to your PATH
export PATH="$PATH:$PWD"

请注意,引用变量通常也是一个好主意,因为空格或其他字符在未引用时可能会导致问题。例如,PATH=/tmp/foo bar:$PATH 要么根本不工作,要么不按预期工作。所以,为了安全起见,把它包起来(带引号)!

使用 Direnv 进行 Project-Based PATH 更改

您还可以考虑使用像 direnv 这样的实用程序,它可以让您在进入 known-safe 目录时将当前工作目录添加到 PATH ,并在离开目录时将其从 PATH 中删除。这通常用于开发项目,包括 shell 脚本项目。

例如,您可以创建以下 ~/dev/foo/.envrc 文件,它只会在 ~/dev/foo 中时添加当前工作目录,并在您移动到当前 .envrc 之上时再次删除它在你的文件系统中:

# ~/dev/foo/.envrc
#
# prepend "$HOME/dev/foo:$HOME/dev/foo/bin" to your 
# existing PATH when entering your project directory,
# and remove it from your PATH when you exit from the
# project

PATH_add "$PWD/bin"
PATH_add "$PWD"

因为 direnv 使用白名单并确保您的项目预先添加到 PATH,它通常是一种更安全且更少 error-prone 的方式来管理对 project-specific 的修改您的 PATH 或其他环境变量。

使用“$HOME/bin”合并脚本

另一种选择是在您的主目录中为 shell 脚本创建一个目录,并将其添加到您的 PATH。然后,放置在那里的任何脚本都可以从文件系统上的任何地方访问。例如:

# add this line to .profile, .zprofile, .zshrc, or
# whatever login script your particular terminal calls;
# on macOS, this should usually be .zprofile, but YMMV
export PATH="$HOME/bin:$PATH"

# make a ~/bin directory and place your
# executables there
mkdir -p ~/bin
cp helloworld.sh ~/bin/

假设您的 bin 目录中的 shell 脚本已经设置了可执行位(例如 chmod 755 ~/bin/*sh),您可以 运行 该目录中的任何 shell 脚本文件系统上的任何位置。