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

17

我是Linux的新手,从基础开始学习。

-- 我以为alias是用来为命令创建一个快捷方式的。但我在Ubuntu上尝试了以下使用变量的方法,它仍然有效!

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

使用别名:

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

这是它应该工作的方式吗? 非常感谢您的答案 :)

5个回答

21

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

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

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

变量也可以导出到子进程的环境中。如果您使用内置的 export 命令导出变量,那么程序可以使用getenv(3)函数获取变量的值。

有关所有不同类型扩展及其执行方式的完整说明,请参阅Bash手册。还请参阅有关别名的章节。


太酷了!我喜欢所有的答案,但我必须选择这个。 - Rei
你会认为这种解决方案(使用变量)是一个好的做法吗? - Dawid Fieluba

5

"变量比别名更加灵活多用" - 这并不完全正确!

对于执行命令,变量存在一些限制,而别名则没有这些限制。

试着使用一个变量来定义一个向命令行打印单个星号的命令:

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

*被扩展了-这不是你想要的-那么试试这个:

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

但现在你有额外的引号出现了 - 你也不希望这样!

但这个可以正常工作:

$ echo "*"
*

这也是如此:

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

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

3
请注意,当您将别名输入为命令时,不需要键入$符号;但是,当您输入变量时,必须包括它。因此,别名更像是命令的替代名称。

3
在变量形式中,它会被扩展和评估。
因此,
$ $foo

被扩展为

$ mkdir Directory

这可以进行评估。这是与foo作为参数相同类型的扩展:

$ echo $USER

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


0

变量在使用时替换其内容。

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

别名作为实际命令,或者说是一个命令的前缀。

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

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