我最近正在编写一个bash脚本,想知道何时实际需要它来填充当前目录确定器。
if [ ! -f .env ]; then
fi
或
if [ ! -f ./.env ]; then
fi
完全需要后者吗?如果是这样,什么时候,有什么区别?
答案 0 :(得分:1)
在.
中包含PATH
通常是一个坏主意。因此,当您要从当前目录运行程序时,需要使用./
路径前缀,以便命令解释器知道该程序应该在当前目录中找到。
PATH
是and环境变量,列出了命令搜索路径。外壳将使用它来搜索程序。您可以使用echo $PATH
进行打印。
如果您的命令或程序不在PATH
中列出的目录之一中,则需要明确证明该命令或程序的(完整或相对)路径。例如/usr/local/bin/somecommand
。
现在让我们说,在当前目录中(.
始终是“当前”目录,无论您位于哪个目录中),都有一个名为foo
的程序,然后执行该程序即可需要使用./foo
。
但是 ,如果您不想要在当前目录中执行程序foo
,例如,您只想要将其与ls -l
一起列出,则无需指定目录前缀./
,因为它将在当前目录中查找。
因此,要在当前目录中运行程序foo
:
./foo
仅在当前目录中列出foo
:
ls -l foo
./foo
和foo
是同一文件。区别在于命令执行不会自动在当前目录中查找。对于其他每种情况,都取决于个人风格和选择使用哪种变体。
答案 1 :(得分:0)
在某些情况下,您确实需要./foo
而不是foo
作为参数:
要防止将参数用作选项
$ touch -f # touch treats -f as an option
$ touch ./-f # touch works on a local file named -f
用于统一处理循环中的路径名
for x in ./foo bar/baz; do
dir=${x%%/*} # . for ./foo, bar for bar/baz
...
done
防止进行PATH
查找
$ . ./ls # Source a file named "ls" in the local directory
$ . ls # Attempt to source a file named "ls" somewhere in your path
# (which will fail, since ls is almost certainly not a shell script)