Bash命令:变量和别名之间有什么区别?

时间:2011-09-08 03:12:30

标签: linux bash ubuntu terminal

我是linux新手,从基础开始。

- 我认为别名用于创建命令的快捷方式。 但我尝试了以下使用变量(在U​​buntu中)并仍然有效!

$ foo="mkdir Directory"
$ $foo #this will create a directory named Directory

使用别名:

$ alias bar="mkdir Directory"
$ bar #creates a Directory named directory

它是如何工作的? 非常感谢答案:)

5 个答案:

答案 0 :(得分:15)

变量比别名更通用。变量可以在命令行中的任何地方使用(例如,作为程序参数的一部分),而别名只能 用作要运行的程序的名称,即作为命令行中的第一个单词。例如:

foo="mkdir Directory"
echo $foo  # Prints "mkdir Directory"

alias bar="mkdir Directory"
echo bar  # Nothing gets expanded -- just "bar" is printed

变量也可以导出到子进程的环境中。如果使用export builtin导出变量,则程序可以使用getenv(3)函数来获取变量的值。

有关它可以执行的所有不同类型扩展及其执行方式的完整描述,请参阅Bash manual。另请参阅aliases部分。

答案 1 :(得分:2)

“变量比别名更通用” - 不完全正确!

对于执行命令,变量有一些限制,不能由别名共享。

尝试使用变量来定义将单个星号回显到命令行的命令:

$ myCommand="echo *"
$ $myCommand
file1.x file2.y file3.z

*被扩展 - 这不是你想要的 - 所以试试这个:

$ myCommand="echo \"*\""
$ $myCommand
"*"

但现在你出现了额外的引号 - 你也不想要它!

但这样可行:

$ echo "*"
*

这样做:

$ alias myCommand="echo \"*\""
$ myCommand
*

这是因为变量内部的引号被视为文字,而不是扩展变量时的语法 - 所以在这种情况下它们成为传递给echo命令的参数的一部分 - 而使用别名执行命令“按原样”,引号被视为语法,并在调用echo之前进行解析,就像直接从命令行键入相同的命令一样。

答案 2 :(得分:1)

请注意,当您键入别名时,就好像它是一个命令一样,您不要键入$;键入变量时,必须包含它。因此,别名更自然地作为命令的替代名称。

答案 3 :(得分:1)

在变量形式中,它被扩展和评估。

因此

$ $foo

扩展为

$ mkdir Directory

可以评估。这与foo是一个论证是相同的扩展类型:

$ echo $USER

对于别名,您可以使用名称(no $)直接引用它们,只有在它是第一个单词时才会展开它。

答案 4 :(得分:0)

变量会在任何地方替换它们的内容。

$ foo="mkdir Directory"
$ $foo
$ echo "$foo"

别名充当实际命令,或者更确切地说是一个的前缀。

$ alias bar="mkdir Directory"
$ bar directory2  #creates directories named "directory" and "directory2"
$ echo bar