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

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

– 我以为别名被用来做一个命令的快捷方式。 但我尝试了下面的使用variables(在U​​buntu中),仍然有效!

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

使用别名:

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

这是应该如何工作? 非常感谢您的答案:)

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

 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手册以获取它可以执行的所有不同类型的扩展的完整描述以及它如何执行它们。 另见关于别名的部分。

注意,当你输入别名就好像它是一个命令,你不要输入$ ; 当你输入一个变量时,你必须包含它。 所以别名更自然地作为一个命令的替代名称。

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

于是

 $ $foo 

扩大到

 $ mkdir Directory 

可以评估。 这与foo是一个论点是一样的扩张类型:

 $ echo $USER 

对于别名,可以直接使用名称(no $)引用它们,并且只有在第一个单词的情况下才会展开。

无论使用哪个变量,变量都会被替换。

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

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

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

“变量比别名多得多” – 不完全正确!

为了执行命令,变量有一些不被别名共享的限制。

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

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

*展开 – 这不是你想要的 – 然后试试这个:

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

但现在你有额外的报价出现 – 你也不想要那个!

但是,这工作正常:

 $ echo "*" * 

这样做也是这样的:

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

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