是否应该在Shell脚本中的路径变量末尾使用斜杠?[关闭]


11

今天写我的shell脚本时。

我突然想到一个问题。

由于cd /target_dircd /target_dir/都有效。
我是否应该在Shell脚本的路径变量末尾添加斜杠?
LOG_PATH=/data/nginx/logsLOG_PATH=/data/nginx/logs/

我在Google上进行了总体搜索,但没有找到关于此的讨论,也许这太基础了?

目前,我真的很难决定选择哪种风格。
但我更喜欢LOG_PATH=/target_dir/样式。
因为当我使用bash进行自动补全时,它会以斜杠弹出结果。

您对此有何看法?



没有规则。两种编码风格都有其优点和缺点。
andcoz 2015年

Answers:


9

根据POSIX:

路径名的定义:

用于标识文件的字符串。它具有可选的以<斜杠>开头的字符,后跟零个或多个用<斜杠>字符分隔的文件名。路径名可以选择包含一个或多个结尾的<斜杠>字符。多个连续的<slash>字符被认为与一个<slash>相同,除了恰好两个前导<slash>字符的情况外。


@这很有趣,我可以在bash提示符下以不同的方式显示///显示其名称,并使用来pwd显示不同的路径,但是它们的内容是相同的!为什么?


1
因为bash以非常幼稚的方式跟踪当前目录(作为字符串)。它只是试探性地添加和删除路径,而不链接到实际的文件系统。结果之一是,您可以使用cd进入符号链接并以相同的方式返回(如果bash不能确定它太多并重新初始化)。另一个就是你所描述的。您不应该依赖shell对当前目录的跟踪,这是不可靠的。
Orion


6

为了安全起见,请加上斜线。连接路径时,这可能导致多个斜杠,但至少可以避免问题。

一些示例:rsync如果包含尾部斜杠,则以不同的方式对待路径(它同步目录而不是创建另一个子目录)。当目录的符号链接没有尾部斜杠时,它们有时会以意想不到的方式工作-至少使外壳补全感到困惑。您永远不会知道您调用的命令/脚本是否依赖于检查斜线是否有某些特殊行为。它甚至可以使您免于覆盖某些内容。例如,如果您有一个名为的文件foo,但您错误地认为它是目录并想在其中移动某些内容,mv bar foo则将覆盖该文件(数据丢失,潜在的灾难),但mv bar foo/只会抱怨而无所事事。

因此,总的来说,在大多数情况下都没有关系,但是您应该使用斜杠来保护自己,并让人类读者更清楚地知道您打算在脚本中做什么。临时观察者将立即确保变量以斜杠结尾时引用目录,并且在需要修改时将正确使用该目录。


2

不,你不应该。它添加了一个多余的斜杠(/)。

说您想将Java bin目录导出到您的PATH变量,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

现在检查一下

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

注意/java之前的额外斜杠(),但幸运的是,它仅在这种情况下有效。


我在此链接中看到一个31票的答案,作者认为我们应该添加一个斜线。我糊涂了。stackoverflow.com/questions/980255/...

@Zen,是的,我检查过,这是您问题的第一条评论。谢谢。
Arnab 2015年

6
有两个斜杠总比没有好。这是丑陋的,但很安全。。。另一种方法更糟,可能很危险。
Orion
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.