别名和导出(和函数!)之间有什么区别![BASH]?

Ale*_*ray 8 bash shell command zsh apropos

以前没有被问过我很惊讶,但......

有什么区别

别名alias EXPORT='alias'

功能function exporter() { echo $EXPORT }

出口export ALIAS='export'

就此而言......

alias export=$(function) (J/K)

in bash(zsh,et al.)

具体来说,我最感兴趣的是要知道它们之间的词汇/实际区别

alias this=that
Run Code Online (Sandbox Code Playgroud)

export that=this
Run Code Online (Sandbox Code Playgroud)

我有两种形式 ...... 到处都是 - 并且宁愿任意选择一种,而不是另一种.

我确信在某个地方有一个很好的"unix shell范围和用例"的引用......但我想在这里以正义 - 规范主义的名义发布这个问题.

Gor*_*son 14

你要问的是两类非常不同的东西:别名和函数定义了像命令一样的东西; export标记要导出到子进程的变量.让我先看看命令式的东西:

alias(alias ll='ls -l')定义命令的简写.它们用于交互式使用(它们在shell脚本中默认禁用),并且简单但不灵活.例如,您在别名后指定的任何参数只会被添加到命令的末尾; 如果你想要类似的东西alias findservice='grep "$1" /etc/services',你就做不到,因为$1这里没有做任何有用的事情.

函数就像一个更灵活,更强大的别名版本.函数可以处理和处理参数,包含循环,条件,here-文档等等......基本上,你可以用函数完成shell脚本所做的任何事情.请注意,定义函数的标准方法实际上并不使用关键字function,只是在名称后面使用括号.例如:findservice() { grep "$1" /etc/services; }

好的,现在转到shell变量了.在我到达之前export,我需要谈谈未导出的变量.基本上,您可以定义一个变量以具有某些(文本)值,然后如果您通过$variablename它引用变量,它将被替换为命令.这与别名或函数有两种不同:别名或函数只能作为命令中的第一个单词出现(例如,ll filename将使用别名ll,但echo ll不会),并且必须显式调用变量$(echo $foo将使用变量foo) ,但echo foo不会).

还有一些"特殊"shell变量,它们由shell自动设置(例如echo "$foo"),或影响shell的行为方式(例如echo $foo控制它查找可执行命令的位置),或两者兼而有之.

$HOMEED变量是可用的既在当前外壳,并且还传递到任何的子过程(子shell,其他命令,等等).例如,如果我这样做$PATH,那就告诉我当前的shell使用"en_US.UTF-8"语言环境设置.另一方面,如果我这样做export会告诉当前shell 以及它执行的所有子进程和命令以使用该语言环境设置.

请注意,shell变量可以与定义它一起标记为导出,一旦导出它就会保持导出状态.例如,LC_ALL=en_US.UTF-8(据我所知)总是被导出,因此export LC_ALL=en_US.UTF-8具有相同的效果$PATH(尽管后者可能是首选,以防$ PATH某种方式尚未导出).

通过将赋值用作命令的前缀,还可以将变量导出到特定命令,而无需在当前shell中定义它.例如,PATH=/foo:/bar将告诉export PATH=/foo:/bar命令使用"en_US.UTF-8"语言环境设置,但不将其应用于当前shell(或任何其他命令).

  • bash允许导出函数(带有`export -f`),但这只是bash的功能-我不知道可以导出函数的其他shell,或者可以理解bash导出的函数。因此,该功能虽然存在,但却是非标准且有点怪异。而且,据我所知,没有外壳支持导出别名。 (2认同)