我知道这肯定是一件愚蠢的事情但不知何故我还是试图为 shell 函数创建一个快捷方式(别名)。
以下是我的确切信息.bash_profile
:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # 将 RVM *作为函数* 加载到 shell 会话中 别名 l="ls -G" r(){ 回显“iron_worker 上传 $1” 回显“iron_worker 队列 $1” } 导出-fr
r()
所以我在文件末尾添加了我的函数。现在当我r
在 shell 中输入时,仍然会出现错误:
-bash: r: command not found
我已经重新启动了终端和shell窗口,但仍然没有效果。
如果这很重要的话,我使用的是 Mac OS 10.8.5。
编辑。
经过一番搜索发现这个问题建议使用bash_profile
而不是bashrc
,现在它可以正常工作了!但是...我得到的是列出但未执行的命令:
Dmitris-MacBook-Pro:~ dmitrizaitsev$ r iron_worker 上传 iron_worker 队列
这是我预期的正常命令执行:
Dmitris-MacBook-Pro:~ dmitrizaitsev$ iron_worker 上传 请指定代码包名称或workerfile的路径 用法:iron_worker 上传 CODE_PACKAGE_NAME_OR_PATH_TO_WORKERFILE [OPTIONS] -n, --name NAME 覆盖代码名称 -c CONCURRENCY,此代码包的最大并发工作者数量 --最大并发 -r, --retries NUM_RETRIES 任务失败时自动重试的最大次数 -d RETRIES_DELAY,每次自动重试之间的延迟 --retries-delay --worker-config CONFIG_FILE 工人配置文件 -h, --host HOST 主机名,例如:www.mydomain.com -a, --async 不等待包构建 --full-remote-build 激活完整远程构建 --config 配置配置文件 -e, --env ENV 环境 --project-id PROJECT_ID 项目 ID Dmitris-MacBook-Pro:〜dmitrizaitsev$
相反,我只收到命令,没有收到其他任何内容。知道发生了什么吗?
答案1
您应该在同一个文件中使用以下行:
export -f r
要检查这是否有效,您必须使用您已启动并获取 .bashrc 的其他 shell after
,以便它可以继承新功能。在较旧的 shell 中,这将不起作用。
另外,将其插入到您的~/.bash_profile
:
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
如果你想运行程序 iron_worker,那么函数 r 的主体应该是:
r () {
iron_worker upload $1
iron_worker queue $1
}
另外,我建议您为命令 iron_worker 提供完整的路径名(即用 替换iron_worker
)/path/to/iron_worker
。
答案2
终端和 iTerm 默认打开新 shell 作为登录 shell,因此 bash 可以读取~/.bash_profile
但不能~/.bashrc
。
您可以:
- 使用
~/.bash_profile
而不是~/.bashrc
。 - 添加。
. ~/.bashrc
~/.bash_profile
- 使用非登录 shell 打开新 shell,例如通过将“打开的 shell”从“默认登录 shell”更改为
/bin/bash
终端中的命令。
我已经完成了最后两项。例如,默认情况下,tmux 和 Emacs 中的 shell 模式会将新的登录 shell 作为非登录 shell 打开。~/.bash_profile
当我 ssh 到我的计算机时仍会读取。
看https://www.gnu.org/s/bash/manual/html_node/Bash-Startup-Files.html了解更多信息。
function
顺便说一下,函数定义中的关键字是多余的。与bash 中的function name() { :; }
相同name() { :; }
。该function
关键字不是由 POSIX 定义的。