今天在写shell脚本的时候。
我突然想到一个问题。
因为两者cd /target_dir
都cd /target_dir/
有效。
我应该在 shell 脚本中的路径变量末尾添加斜杠吗?
比如LOG_PATH=/data/nginx/logs
对LOG_PATH=/data/nginx/logs/
。
我在谷歌上做了一些粗略的搜索,但没有找到关于这个的讨论,也许它太基础了?
目前,我真的很难决定选择哪种风格。
但我LOG_PATH=/target_dir/
更喜欢风格一点。
因为当我用 bash 进行自动完成时,它会用斜杠弹出结果。
对此你有何看法,为什么?
答案1
根据 POSIX:
路径名的定义:
用于标识文件的字符串。它有可选的开头<斜线>字符,后跟零个或多个文件名,由<斜线>人物。路径名可以选择包含一个或多个尾随<斜线>人物。多次连续<斜线>字符被认为是相同的<斜线>,除了恰好两个前导的情况<斜线>人物。
答案2
为了安全起见,请包含斜线。连接路径时这可能会导致出现多个斜杠,但至少可以避免出现问题。
几个例子:rsync
如果包含尾部斜杠,则以不同方式对待路径(它同步那目录而不是创建另一个子目录)。当目录的符号链接没有尾部斜杠时,有时会以意想不到的方式运行 - 至少 shell 完成会变得混乱。您永远不知道您调用的命令/脚本是否依赖于检查斜杠是否有某些特殊行为。它甚至可以避免您覆盖某些内容。例如,如果您有一个名为 的文件foo
,但您错误地认为它是一个目录并想要在其中移动某些内容,那么mv bar foo
将覆盖该文件(数据丢失,潜在的灾难),但mv bar foo/
只会抱怨并且不执行任何操作。
所以总而言之,大多数情况下这并不重要,但您应该使用斜杠来保护自己,并且让人类读者更清楚您打算在脚本中做什么。如果一个变量以斜线结尾,一个不经意的观察者会立即确定它引用的是一个目录,并且如果需要修改它,会正确使用它。
答案3
不,你不应该这么做。它添加了一个不必要的斜线 ( /
)。
例子
假设你想将 java 的bin
目录导出到你的PATH
变量中,
export PATH=$PATH:/opt/jre1.7.0_45/bin/
现在检查一下,
user@host:~$ which java
/opt/jre1.7.0_45/bin//java
注意java前面的额外斜杠(/
),幸运的是它只适用于这种情况。