如何在 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 脚本文件系统上的任何位置。
我正在研究 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 脚本文件系统上的任何位置。