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

14

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

从以下示例中可以看到:命令I_am_only_ls_alias将输出与ls命令相同。

 # alias I_am_only_ls_alias=ls
 # I_am_only_ls_alias

输出:

file   file1

但是当我尝试在bash脚本中执行相同的操作(定义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脚本内定义别名应该怎么做?这是可能的吗?


我认为别名不会从父Shell继承到子Shell。 - R Sahu
@RSahu:这里不相关。 - Karoly Horvath
3个回答

26

bash man 手册中可知:

当shell不处于交互模式时,别名不会被扩展,除非使用shopt设置expand_aliases shell选项(请参见下文的SHELL BUILTIN COMMANDS下的shopt描述)。

因此,这应该有效:

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

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


干得好,这就是我想要的。 - maihabunash
是的,你说得对 - 但在某些独特的情况下,我需要定义别名。 - maihabunash
我觉得很难相信。如果你定义一个函数,为什么它不起作用呢? - Barmar
从 man 页面中:使用 unset 内置的 -f 选项可以删除函数定义。 - Barmar
3
我可以翻译为:我敢打赌你正在做某件事情的更好方法。这很可能是一个XY问题。 - Barmar
显示剩余7条评论

3

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仍然是脚本的名称,而不是函数的名称。

1
不要忘记在“$@”周围加上引号。 - Yzmir Ramirez
1
@YzmirRamirez,是的,这是更好的方法,我已经将它们添加到示例中。 - TimP

1

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

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


1
他试图在定义别名的同一脚本中使用该别名。 - Barmar
1
@MVP 我认为Barmar有解决方案。 - maihabunash

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