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

Rei*_*Rei 12 linux bash terminal ubuntu

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

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

$ foo="mkdir Directory"
$ $foo #this will create a directory named Directory
Run Code Online (Sandbox Code Playgroud)

使用别名:

$ alias bar="mkdir Directory"
$ bar #creates a Directory named directory
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*eld 18

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

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

alias bar="mkdir Directory"
echo bar  # Nothing gets expanded -- just "bar" is printed
Run Code Online (Sandbox Code Playgroud)

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

有关它可以执行的所有不同类型的扩展及其执行方式的完整描述,请参阅Bash手册.另请参阅有关别名的部分.


Dan*_*ing 6

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

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

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

$ myCommand="echo *"
$ $myCommand
file1.x file2.y file3.z
Run Code Online (Sandbox Code Playgroud)

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

$ myCommand="echo \"*\""
$ $myCommand
"*"
Run Code Online (Sandbox Code Playgroud)

但现在出现了额外的引号 - 您也不希望出现这样的情况!

但这工作正常:

$ echo "*"
*
Run Code Online (Sandbox Code Playgroud)

这也是如此:

$ alias myCommand="echo \"*\""
$ myCommand
*
Run Code Online (Sandbox Code Playgroud)

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