Bash 我应该在环境路径名中使用引号吗?
我正在清理我所有的配置文件,以使它们尽可能可读。我一直在寻找有关导出路径时使用引号的样式指南,例如,在Bash 我应该在环境路径名中使用引号吗?,bash,shell,dotfiles,Bash,Shell,Dotfiles,我正在清理我所有的配置文件,以使它们尽可能可读。我一直在寻找有关导出路径时使用引号的样式指南,例如,在~/.bashrc文件中: export PATH="/users/me/path:$PATH" vs 谷歌指南建议避免在路径名中加引号。相比之下,许多流行的点文件回购协议(如扎克·霍尔曼的)都使用引号。在路径中使用引号有什么好处吗?test 123是UNIX上的有效路径名。试一试 PATH=test 123 它将返回: 123: command not found 甚至 export P
~/.bashrc
文件中:
export PATH="/users/me/path:$PATH"
vs
谷歌指南建议避免在路径名中加引号。相比之下,许多流行的点文件回购协议(如扎克·霍尔曼的)都使用引号。在路径中使用引号有什么好处吗?test 123是UNIX上的有效路径名。试一试
PATH=test 123
它将返回:
123: command not found
甚至
export PATH=test 123
哪个会回来
bash export: `123': not a valid identifier
它回答了你的问题吗
老实说,我不会遵循这种第四方风格的指南。尽管我很惊讶,即使是谷歌也在宣传这样错误的建议
我谨此陈辞:
~
的路径,请有选择地保留~/
不带引号,以确保~
已展开;e、 g.:导出路径=~/“bin:$PATH”
。
有关变量赋值中展开的规则,请参见下文。或者,只需在单引号字符串中使用
$HOME
:export PATH=“$HOME/bin:$PATH”
注:以下内容适用于
bash
、ksh
和zsh
,但(大部分)不适用于严格符合POSIX的外壳,如dash
;因此,当您以/bin/sh
为目标时,必须双引号引用导出的RHS
[1]
- 只有在RHS的文字部分(要指定的值)既不包含空格也不包含其他shell元字符时,双引号才是可选的。
- 引用的变量值是否包含空格/元字符并不重要-请参见下文。
- 再次说明:当使用
时,它与export
有关系,因此始终在那里使用双引号sh
- 再次说明:当使用
- 具体地说,即使执行了初始分词,它也只应用于未展开(原始)RHS(这就是为什么需要在文本中引用空格/元字符),而不应用于其结果
- 此仅适用于形式为
在所有类似POSIX的shell中,即变量名之前没有命令名;请注意,这包括在命令前面添加的赋值,用于为其定义特殊环境变量,例如,=
foo=$bar cmd…
- 为安全起见,其他命令上下文中的赋值应始终使用双引号:
- 对于
(在(大多数情况下)严格兼容POSIX的shell中,如sh
),使用dash
的赋值被视为常规命令,而export
部分被视为foo=$bar
内置的第一个参数,因此被视为常规命令(也可根据结果进行分词)。export
(POSIX没有指定任何其他涉及(显式)变量赋值的命令;
、declare
和typeset
是非标准扩展)local
,bash
,ksh
,在与POSIX的一个可以理解的偏差中,将赋值逻辑扩展到zsh
和export foo=$bar
。换句话说:typeset/declare/local foo=$bar
,bash
,ksh
zsh
,zsh
com命令被视为作业,因此引用不是绝对必要的export/typeset/declare/local
- 对于
- 也许令人惊讶的是,
,它也选择实现非POSIXdash
builtin[2] ,不将赋值逻辑扩展到它;但是,它与它的local
行为一致导出
env
(例如,env foo=$bar cmd…
)的赋值也会作为命令参数进行扩展,因此需要双引号-除了在zsh
中
与env
和ksh
中的bash
在这方面的作用不同,这是因为export
是一个外部实用程序,而env
是一个shell内置程序。export
(
的行为与其他shell在未引用变量引用时的行为根本不同)zsh
~
)扩展如下所示:
- 除了需要取消引号的
之外,它通常也只适用于:~
- 如果整个RHS为
;例如:~
foo=~#与:foo=“$HOME”
- 否则:仅当满足以下两个条件时:
- 如果
开始字符串或前面有一个不带引号的~
:
- 如果
后面跟着一个不带引号的~
/
- e、 g.,
foo=~/bin#与foo=“$HOME/bin”
foo=$foo:~/bin#与foo=“$foo:$HOME/bin”相同
- 如果
- 如果整个RHS为
bash
、ksh
和zsh
中,即使使用export
,您也可以避免重复引用
bash export: `123': not a valid identifier
#!/usr/bin/env bash
# or ksh or zsh - but NOT /bin/sh!
# Create env. variable with whitespace and other shell metacharacters
export FOO="b:c &|<> d"
# Extend the value - the double quotes here are optional, but ONLY
# because the literal part, 'a:`, contains no whitespace or other shell metacharacters.
# To be safe, DO double-quote the RHS.
export FOO=a:$foo # OK - $FOO now contains 'a:b:c &|<> d'