别名

在 Bash 中,别名(alias)是一种命令替换机制,允许你为命令或命令序列定义简短的名称。这可以节省输入时间,并使命令更具可读性。

要查看当前已定义的别名,你可以使用 alias 命令。

要定义一个别名,你可以使用 alias 命令,后跟别名名称和要替换的命令。例如,要定义一个别名 ll 来代替 ls -l,你可以这样做:

alias ll='ls -l'

但是,请注意,这种方式定义的别名只会在当前 shell 会话中有效。如果你想让别名在所有新的 shell 会话中都有效,你需要将 alias 命令添加到你的 shell 初始化文件中。对于 Bash,这通常是 ~/.bashrc~/.bash_aliases 文件(如果你有这个文件)。

以下是如何将别名 ll 添加到 ~/.bashrc 文件的示例:

echo 'alias ll="ls -l"' >> ~/.bashrc

然后,你需要重新加载 ~/.bashrc 文件以使更改生效。这可以通过在终端中运行 source ~/.bashrc 或简单地关闭并重新打开一个新的终端窗口来完成。

除了基本的命令替换外,别名还可以用于更复杂的命令序列。例如,你可以定义一个别名来快速切换到某个目录:

alias cdp="cd /path/to/your/directory"

然后,只需输入 cdp 即可切换到该目录。

脚本在 “复合结构” 中并不能扩展自身的别名,例如 if/then, 循环和函数. 另一个限制是,别名不能递归扩展. 基本上是我们无论怎么喜欢用别名都不如函数 function 来的更有效.

#!/bin/bash
# alias.sh

shopt -s expand_aliases
# 必须设置此选项, 否则脚本不能别名扩展.


# 首先来点好玩的东西.
alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."'
Jesse_James

echo; echo; echo;

alias ll="ls -l"
# 可以任意使用单引号 (') 或双引号 (") 把别名括起来.

echo "Trying aliased \"ll\":"
ll /usr/X11R6/bin/mk*   #* 别名可以运行.

echo

directory=/usr/X11R6/bin/
prefix=mk*  # See if wild card causes problems.
echo "Variables \"directory\" + \"prefix\" = $directory$prefix"
echo

alias lll="ls -l $directory$prefix"

echo "Trying aliased \"lll\":"
lll         # 所有 /usr/X11R6/bin 文件清单以 mk 开始.
# 别名可以处理连续的变量 -- 包含 wild card -- o.k.




TRUE=1

echo

if [ TRUE ]
then
  alias rr="ls -l"
  echo "Trying aliased \"rr\" within if/then statement:"
  rr /usr/X11R6/bin/mk*   #* 结果报错!
  # 别名在复合的表达式中并没有生效.
  echo "However, previously expanded alias still recognized:"
  ll /usr/X11R6/bin/mk*
fi  

echo

count=0
while [ $count -lt 3 ]
do
  alias rrr="ls -l"
  echo "Trying aliased \"rrr\" within \"while\" loop:"
  rrr /usr/X11R6/bin/mk*   #* 这里的别名也没生效.
                           #  alias.sh: 行 57: rrr: 命令未找到
  let count+=1
done 

echo; echo

alias xyz='cat $0'   # 列出了自身.
                     # 注意强引.
xyz
#  这看起来能工作,
#+ 尽管 bash 文档不介意这么做.
#
#  然而, Steve Jacobson 指出,
#+ "$0" 参数的扩展在上面的别名申明后立刻生效.

exit 0
#!/bin/bash
# unalias.sh

shopt -s expand_aliases  # 开启别名扩展.

alias llm='ls -al | more'
llm

echo

unalias llm              # 取消别名.
llm
# 'llm' 不再被识别后的报错信息.

exit 0
bash$ ./unalias.sh
total 6
drwxrwxr-x    2 bozo     bozo         3072 Feb  6 14:04 .
drwxr-xr-x   40 bozo     bozo         2048 Feb  6 14:04 ..
-rwxr-xr-x    1 bozo     bozo          199 Feb  6 14:04 unalias.sh

./unalias.sh: llm: 命令未找到