【问题标题】:How to set an alias inside a bash shell script so that is it visible from the outside? [duplicate]如何在 bash shell 脚本中设置别名,以便从外部可见? [复制]
【发布时间】:2010-02-04 05:16:43
【问题描述】:

OSX:这可以从命令行运行:

alias ruby="/opt/local/bin/ruby1.9"

但在 shell 脚本中,它没有任何作用。我想编写一个在 ruby​​ 1.8 和 ruby​​ 1.9 之间切换的脚本,所以这需要是一个脚本 - 不在我的个人资料中。

似乎“source script.sh”有效,但“./script.sh”。为什么是这样?如何在我的脚本中复制它?

【问题讨论】:

    标签: bash


    【解决方案1】:

    对您来说简单的答案是脚本创建非交互式 shell,默认情况下,expand_aliases 选项通常被禁用。

    您可以非常简单地解决这个问题,只需在脚本顶部添加以下行以启用别名扩展:

    shopt -s expand_aliases

    这个问题一直困扰着我,所以我做了研究,然后在我弄清楚如何为自己解决它之后写了一篇博客文章: Post about using alias from within Linux shell scripts.

    当然,在我弄清楚那部分之后,我发现虽然它可以满足您的需求,但如果您在子shell中有一个子shell,它就不起作用。我仍在寻找解决该问题的方法,这就是我刚刚遇到您的问题的方式。在博客文章中,我提到了一个廉价的黑客,我用它来获取 shell 脚本中的别名。它并不优雅,但即使在我遇到的这个多子外壳问题中它也确实有效。

    【讨论】:

    • 这是一个比公认的更好的答案。如果您通过搜索来到这里,这可能就是您想要的。
    • 尽管我不是 OP 想要的,但这正是我正在寻找的!谢谢
    • 最佳答案。你应该在你的 bash 脚本中添加这个顶部,而不是 ~/.bash_profile。
    • 不适用于 ubuntu 14.04。我希望脚本更改我的别名。但它只是在脚本运行期间更改别名。
    • 只是大声说出来,这是对完全不同的问题的一个很好的回答。匹配的问题是:Why is the alias command not working inside a bash script,它已经在这里了:askubuntu.com/questions/98782/…
    【解决方案2】:

    ./script.sh 将在子 shell 中执行,所做的更改仅适用于子 shell。一旦命令终止,子 shell 就会执行,更改也会执行。

    使用. ./script.shsource ./script.sh 获取文件将从当前shell 上下文中的文件名参数读取并执行命令,也就是说,当使用source 运行脚本时,它会在现有shell 中运行,任何脚本创建或修改的变量在脚本完成后仍然可用。

    【讨论】:

      【解决方案3】:

      您可以在 .profile 中编写一个函数来切换别名

      function toggle-ruby() {
        if [ "$1" == "1.9" ]; then
          alias ruby=/opt/local/bin/ruby1.9
        else
          alias ruby=/opt/local/bin/ruby1.8
        fi
      }
      

      然后运行就可以运行了:

      toggle-ruby 1.9
      

      toggle-ruby 1.8
      

      来回切换。

      【讨论】:

        【解决方案4】:

        如果您需要切换 Ruby 版本,请尝试rvm

        【讨论】:

        猜你喜欢
        • 2014-09-13
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 2022-01-04
        • 2010-10-04
        • 2021-05-08
        相关资源
        最近更新 更多