在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脚本中定义别名,我需要做些什么?有可能吗?
答案 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进程中,因此可以存活并实际按预期工作。