【问题标题】:Why aliases in a non-interactive Bash shell do not work为什么非交互式 Bash shell 中的别名不起作用
【发布时间】:2010-12-09 14:36:21
【问题描述】:

我正在尝试在非交互式 bash shell 中使用别名。我在~/.bashrc 中定义了我的别名,并设置了变量BASH_ENV=~/startUpFile。 startUpFile 的内容是source ~/.bashrc

当我执行alias 命令时,我可以看到我的别名已被识别。但是,如果我尝试使用在~/.bashrc 中定义的别名,Bash 将无法识别它。它给了我未知的命令错误。

使用 TCSH shell 很容易做到这一点,因为~/.cshrc 文件总是被读取。

有什么想法可以用 Bash shell 做到这一点吗?

【问题讨论】:

  • 这个 answerinteractivenon-interactive shell 配置有很好的解释。当您处于non-interactive 模式时,还有一个关于包含.bashrc 的提示。

标签: bash alias non-interactive shopt


【解决方案1】:

我有类似的问题,最后我发现 ~/.bashrc 就是我所需要的。

但是,在 Ubuntu 中,我不得不注释停止处理 ~/.bashrc 的行:

If not running interactively, don't do anything
[ -z "$PS1" ] && return

【讨论】:

  • 我更喜欢检查 $- 的交互性:[ $- == *i* ]] && myalias 只会在交互式 shell 中调用 myalias
【解决方案2】:

.bashrc 仅由交互式 shell 处理。

此外,当 shell 不交互时,别名不会展开,除非使用shopt 设置了expand_aliases shell 选项。当然,除非通过使用名称 sh 而不是 bash 调用 shell 来调用 POSIX 模式。

经常使用别名的人经常在他们的个人资料末尾提供他们的.bashrc,这样即使是非交互式 shell 也可以使用别名。这可能不是最好的方法,但很常见。

正是这样的事情让我相信,在 21 世纪,我们应该放弃 shell 脚本,转而使用像 Python 这样的成熟语言。这更容易预测。

【讨论】:

  • python 是一种糟糕的交互语言。除非空格正是您需要的,否则您不能剪切/粘贴随机代码位。不过,tclsh 提供了一个相当不错的 shell——如果您键入的命令不是已知的 tcl 命令,它具有执行 shell 命令的内置功能。另外,它的本质使得交互式使用成为可能。然而,尽管我是 Tcl 的粉丝,但我仍然更喜欢使用好的 ol' bash 进行交互使用。可惜 tksh 从来没有达到逃逸速度。
  • /etc/profile 技巧仅适用于提供 --login 选项的非交互式 shell
  • 你说得对,Python 是一种糟糕的交互语言。你应该使用 bash。但是,如果您必须编写脚本,请使用 Python。由于它是一种面向对象的语言,因此您可以通过将代码编写为类、方法和函数来重用它们。脚本与编程相同,因此请使用强大的编程语言,如 Python。但是对于交互,对于两三个命令管道,bash 就可以了。
  • 意见提醒!意见警告! (并不是说 Python 本身就存在什么问题——除了动态类型的 O.o 之外——但是 Ruby 和 Perl(还有谁知道还有什么)在这个市场上也是很好的竞争者)
  • 您绝对可以在 bash 中编写“可重用”函数...# ThatsHot (){ echo "Thanks, gorgeous."; }; ThatsHot
【解决方案3】:

你必须

shopt -s expand_aliases

在你的BASH_ENV指向的文件中

【讨论】:

    【解决方案4】:

    shopt -s expand_aliases 命令将允许在非交互式 shell 中进行别名扩展。

    【讨论】:

    • 直到我将别名定义移到函数定义之前,它才对函数上使用的别名起作用;读取函数定义时,别名似乎被扩展了!
    • 也许还提到即使这样,别名在包含此语句的物理代码行中仍不可用,因此单行与此将不起作用。一种解决方法是在命令ssh remote $'shopt -s expand_aliases\nll' 之间使用换行符而不是分号
    • 另一种选择(来自重复项 - 请参见右侧的“链接问题”)是运行 bash -i 以强制 shell 进行交互。
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2013-08-13
    • 2020-11-28
    • 2019-01-31
    相关资源
    最近更新 更多