【问题标题】:DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" How does that work?DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 它是如何工作的?
【发布时间】:2017-01-13 09:21:10
【问题描述】:

我需要获取脚本的路径。如果我已经在同一个目录中,我可以使用pwd 来做到这一点,我在网上搜索并找到了这个

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

但我不知道如何使用它。

【问题讨论】:

  • 你试过了吗,即echo "script=$0 dirForScript=$DIR"?您应该展示您为解决问题所做的尝试。如果您将DIR=... 代码和我的echo script=... 放在一个脚本中并从不同的目录调用主脚本,您应该会看到相同的结果。如果不是,那么这是一个有趣的 Q,你可以更新你的 Q 为什么它“不起作用”。祝你好运。
  • 所以,我现在的脚本文件中有以下代码:#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" ) " && pwd )" echo "script=$0 dirForScript=$DIR 并且我试图从不同的目录运行它,它说:-bash: Send-Transaction.sh: command not found
  • 运行我正在使用 sh filename.sh 。我做错了什么或一切都错了吗?
  • 试试sh /full/path/to/filename.sh。那应该行得通。然后你必须将 /full/path/to 添加到你的 PATH 环境变量中。对于如此简单的事情,一开始可能会非常混乱。不要放弃,但要找到一个好的 linux 教程并通读 PATH 的方式/原因。祝你好运。 (上床睡觉 ;-) .
  • 但是当我已经知道文件名的完整路径时,那有什么用?

标签: linux bash shell unix scripting


【解决方案1】:

Bash 维护了许多变量,包括 BASH_SOURCE,它是一个源文件路径名数组。

${} 充当一种对变量的引用。

$() 充当对命令的一种引用,但它们在自己的上下文中运行。

dirname 为您提供所提供参数的路径部分。

cd 更改当前目录。

pwd 给出当前路径。

&& 是一个逻辑 and,但在此实例中使用它是因为它的副作用是一个接一个地运行命令。

总之,该命令获取脚本的源文件路径名,将其剥离到路径部分,cds 到该路径,然后使用 pwd 返回脚本的(有效)完整路径。这分配给DIR。毕竟,上下文被展开,所以你最终回到了你开始的目录,但环境变量 DIR 包含脚本的路径。

【讨论】:

  • @Anirudh 它只是让脚本知道它自己的位置,而不是你当前的位置。如果您只需要运行脚本时当前所在的位置,那就简单多了:DIR="$( pwd )"
  • 如果脚本知道它的位置,那有什么好处?不知道有区别吗?该脚本仍然有效。
  • 这是我的最后一个问题,保证!
  • 我认为这个答案也应该解释为什么${BASH_SOURCE[0]}而不是${BASH_SOURCE}。否则它是完美的。
  • electrictoolbox.com/bash-script-directory 添加了有用的上下文,说明这种方法与运行dirname $0 的基本选项有何不同(即它确保路径是绝对的,仅使用shell 内置命令,如@987654322 中所述@ 和该问题的其他答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2021-07-25
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多