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
控制它查找可执行命令的位置),或两者兼而有之.
的$HOME
ED变量是可用的既在当前外壳,并且还传递到任何的子过程(子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(或任何其他命令).