当我需要在bash中为当前目录提供./时

时间:2018-12-04 13:42:37

标签: bash

我最近正在编写一个bash脚本,想知道何时实际需要它来填充当前目录确定器。

if [ ! -f .env ]; then
fi

if [ ! -f ./.env ]; then
fi

完全需要后者吗?如果是这样,什么时候,有什么区别?

2 个答案:

答案 0 :(得分:1)

.中包含PATH通常是一个坏主意。因此,当您要从当前目录运行程序时,需要使用./路径前缀,以便命令解释器知道该程序应该在当前目录中找到。


PATH是and环境变量,列出了命令搜索路径。外壳将使用它来搜索程序。您可以使用echo $PATH进行打印。

如果您的命令或程序不在PATH中列出的目录之一中,则需要明确证明该命令或程序的(完整或相对)路径。例如/usr/local/bin/somecommand

现在让我们说,在当前目录中(.始终是“当前”目录,无论您位于哪个目录中),都有一个名为foo的程序,然后执行该程序即可需要使用./foo

但是 ,如果您不想要在当前目录中执行程序foo,例如,您只想要将其与ls -l一起列出,则无需指定目录前缀./,因为它将在当前目录中查找。

因此,要在当前目录中运行程序foo

./foo

仅在当前目录中列出foo

ls -l foo

./foofoo是同一文件。区别在于命令执行不会自动在当前目录中查找。对于其他每种情况,都取决于个人风格和选择使用哪种变体。

答案 1 :(得分:0)

在某些情况下,您确实需要./foo而不是foo 作为参数

  1. 要防止将参数用作选项

    $ touch -f   # touch treats -f as an option
    $ touch ./-f  # touch works on a local file named -f
    
  2. 用于统一处理循环中的路径名

    for x in ./foo bar/baz; do
      dir=${x%%/*}  # . for ./foo, bar for bar/baz
      ...
    done
    
  3. 防止进行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)
    

    这是what Some programmer dude mentions的一般情况。