如何在shell脚本中创建别名?

时间:2014-06-05 07:26:43

标签: bash shell alias

在Linux系统上定义别名非常简单。

从以下示例中我们看到:I_am_only_ls_alias alias命令将输出作为ls命令

 # alias I_am_only_ls_alias=ls
 # I_am_only_ls_alias

输出:

file   file1

但是当我尝试在bash脚本(define alias I_am_only_ls_alias)中执行相同操作时,我得到I_am_only_ls_alias: command not found

我的bash脚本示例:

alias_test.bash

#!/bin/bash

alias I_am_only_ls_alias=ls

I_am_only_ls_alias

运行bash脚本 - alias_test.bash

/tmp/alias_test.bash

输出:

/tmp/: line 88: I_am_only_ls_alias: command not found

所以,首先我要问:

为什么bash不将命令I_am_only_ls_alias识别为别名?

为了在bash脚本中定义别名,我需要做些什么?有可能吗?

3 个答案:

答案 0 :(得分:9)

来自bash手册页:

  

如果shell不是交互式的,则不会展开别名,除非使用expand_aliases设置shopt shell选项(请参阅           SHELL BUILTIN COMMANDS 下的shopt说明。

所以这应该有效:

#!/bin/bash
shopt -s expand_aliases
alias I_am_only_ls_alias=ls
I_am_only_ls_alias

脚本通常使用函数,而不是别名。

答案 1 :(得分:2)

Barmar的答案是包含alias的正确答案,但您实际上可能会发现Bash function更灵活/更有用。

例如,这与alias版本大致相同,但可以更轻松地扩展:

timp@helez:~/tmp$ cat test.sh
#!/usr/bin/bash

function i_am_only_an_ls_func {
  ls $@
}

i_am_only_an_ls_func
timp@helez:~/tmp$ ./test.sh
0600871h.html
[snip]
timp@helez:~/tmp$

$@在此示例中是无关紧要的,但这意味着i_am_only_an_ls_func之后的任何内容都会在ls命令之后添加,因为$@$1$2等包含函数的参数,与普通脚本的参数非常相似。 (请注意,$0仍然是脚本的名称,而不是函数)

答案 2 :(得分:0)

别名无法在您执行的shell脚本中定义 - 一旦shell进程完成执行,它们的效果就会消失。

但是,您可以在~/.bashrc或您source的单独shell脚本中定义别名(但不执行!)。在这种情况下,别名被导入到已经运行的shell进程中,因此可以存活并实际按预期工作。