如何在其他脚本中使用在.bashrc中定义的别名?

46

在~/.bashrc文件中,我定义了一些别名。但是在其他的shell脚本中,我无法使用它们,只能使用那里定义的别名。即使我使用了source命令加载了bashrc文件,仍然不起作用。我该怎么做?

PS. 我使用的是bash shell。


2
关于 drewrobb 所提到的,为了将这些别名与您的 .bashrc 脚本中的其他内容分开,您可能还希望将您的别名隔离到它们自己的文件中(例如 $HOME/.aliases 或其他),并从您的其他 shell 脚本和 .bashrcshoptsource 它。这将避免来自 .bashrc 中其他内容的可能副作用,同时仍将它们放在一个地方以便于维护。 - Sdaz MacSkibbons
如果你能通过执行 . ./my-script.sh 避免生成子Shell,那么 .bashrc 中设置的所有别名都可以在你的脚本中使用,无需进行任何额外的设置。 - anubhava
它可以使用附加的别名文件!但为什么不能使用bashrc? - Dutor
不确定,可能需要看一下你的.bashrc才能告诉你。无论如何,这是更好的解决方案。 - Sdaz MacSkibbons
你不需要依赖于.bashrc来设置交互式shell的环境,因为它只是为交互式shell设置环境。Shell脚本不应该依赖于它。 - chepner
6个回答

35
您需要在脚本中执行 shopt -s expand_aliases 命令,除此之外还需引用 ~/.bashrc

3
如果脚本无法修改,该怎么办? - Iulius Curt
12
请定义和导出函数。假设您的脚本使用mv而没有-i-v,并且您想要添加它们,但无法修改脚本。function mv () { command mv -iv "$@"; }; export -f mv现在您的脚本将使用这些选项。这就是为什么良好编写的脚本使用可执行文件的绝对路径(例如/bin/mv)。这将防止此技术起作用,并且是良好的安全实践。请发布您的问题作为新问题,我会将此作为答案发布。 - Dennis Williamson

11

最简单的答案是做两件重要的事情,否则它就不会起作用。

#!/bin/bash -i

# Expand aliases defined in the shell ~/.bashrc
shopt -s expand_aliases
在此之后,您在~/.bashrc中定义的别名将在您的shell脚本(giga.sh或any.sh)以及该脚本中的任何函数或子shell中可用。
如果您不这样做,您将会收到一个错误:
your_cool_alias: command not found

1
嗨!对我来说,shopt -s expand_aliases 这行似乎没有效果。当我在图形终端(kde Konsole)中使用 ./script.sh 执行脚本时,只需要 #!/bin/bash -i 这一行就足够了,不需要 shopt -s expand_aliases 这一行。同样地,使用 bash -i script.sh 以交互方式(带有-i)运行脚本也可以,而不是使用 bash script.sh,这两行都不需要。虽然我没有找到使用 bash script.sh 执行脚本的方法(这两行都没有用)。 - bogec

5

.bashrc 的目的是为您的交互式 shell 配置环境。如果您有代码希望在 .bashrc 和其他脚本之间共享,那么应将其放在单独的文件中,并通过 每个 .bashrc 和 shell 脚本来获取该文件。


不要简单地使用别名来实现这个功能;而是创建一个shell函数或独立的脚本。 - undefined

2
我遇到了这个问题,我使用以下命令重新加载文件来解决它。
$ source ~/.bashrc 

1

从ask ubuntu的enzotib处窃取:别名已被弃用,应使用shell函数。来自bash手册页面:

对于几乎所有目的,别名都被shell函数取代。

要创建一个函数并将其导出到子shell中,请将以下内容放入您的~/.bashrc中:

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
export -f petsc

然后您可以自由地从脚本中调用您的命令。

有没有任何参考资料表明在Bash中别名将被弃用?那不可能是正确的。 - Xen2050
上面的引用来自于OS X的手册页。它说“supersede”,而我说“deprecated”。也许这只是措辞的问题,但听起来它们似乎不是首选的操作方式。 - Trenton
Debian的man页面说了同样的事情,我不确定但我认为这行代码的意思是如果一个别名和一个函数有相同的名称,函数将优先执行,但实际上并不是这样(不能创建与别名相同名称的函数,但可以创建一个以函数名称命名的别名,然后只有别名“运行”),所以有点模糊。"已弃用"这个词引起了我的注意,就像"此功能已弃用,并将在以后的版本中删除",但似乎对于别名并非如此。 - Xen2050

0

有一种方法可以在不为每个执行的脚本添加行的情况下全局实现:使用BASH_ENV变量。

以下是我针对OS X 10.8.5的设置:

/etc/launchd.conf:

setenv BASH_ENV /Users/DK/.env

~/.bash_profile:

# == Bash setup for interactive shells ==    
# === Environment for all shells ===
. $BASH_ENV    
# [skipped]

~/.env:

# == Setup for all shells ==
# This is executed for all interactive and for non-interactive shells (e.g. scripts)

shopt -s expand_aliases extglob xpg_echo

# [skipped] Misc. variables and PATH setup

# === General aliases ===

alias pause='echo "Press [Return] or [Enter] to continue..."; read' # read -p does not display prompt in Eclipse console

# [skipped]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接