.bashrc 中的 Shell 函数无法识别

.bashrc 中的 Shell 函数无法识别

我知道这肯定是一件愚蠢的事情但不知何故我还是试图为 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 定义的。

相关内容