回答
#!/bin/bash
cd "$(dirname "$0")"
dirname返回'。'在Windows下使用bash时。所以,保罗的回答更好。 – Tvaroh 2013-05-28 10:10:35
也返回'。'在Mac OSX – 2013-07-11 18:16:36
值得注意的是,如果一个符号链接构成'$ 0'的一部分,事情就会中断。在你的脚本中你可能会想到,例如,'../../'指向脚本位置上方两个级别的目录,但是如果符号链接正在运行,则不一定是这种情况。 – 2013-12-24 08:51:30
获取真实路径到脚本
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(这是答案同样在这里我的问题:Get the name of the directory where a script is executed)
cd "$(dirname ${BASH_SOURCE[0]})"
这很容易。有用。
这应该是被接受的答案。适用于OSX和Linux Ubuntu。 – 2016-01-05 19:19:31
当脚本B来自其他脚本A并且您需要使用相对于脚本B的路径时,此功能非常有用。谢谢。 – Enrico 2016-03-19 18:48:29
这也适用于** Cygwin **对于我们这些不幸碰触Windows的人来说。 – 2016-12-18 18:33:22
如果你只需要打印当前工作目录,那么你可以遵循这一点。
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
给执行权限:
chmod u+x test
然后通过./test
执行该脚本,然后就可以看到当前的工作目录。
问题是如何确保脚本在其_own_目录中运行,包括如果它不是工作目录。所以这不是一个答案。无论如何,为什么这样做,而不是...运行'pwd'?看起来像很多浪费的按键给我。 – 2016-10-23 19:01:28
尝试下面的简单的一衬垫:
对于所有UNIX/OSX/Linux的
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
注:双破折号( - )中的命令是用于表示命令选项结束,因此包含破折号或其他特殊字符的文件不会破坏命令。
对于Linux,Mac等* BSD:
cd $(dirname $(realpath $0))
以空格支持:
cd "$(dirname "$(realpath "$0")")";
注:realpath
应安装在最流行的Linux发行版默认情况下(如Ubuntu),但在一些它可能会丢失,所以你必须安装它。
否则,你可以尝试类似的东西(它会使用第一个现有的工具):具体
cd $(dirname $(readlink -f $0 || realpath $0))
对于Linux:
cd $(dirname $(readlink -f $0))
使用GNU * BSD/Mac上的readlink:
cd $(dirname $(greadlink -f $0))
注意:您需要有coreutils
安装 (例如1.安装Homebrew,2.brew install coreutils
)。
在bash
在bash你可以使用Parameter Expansions来实现,像:
cd ${0%/*}
但如果脚本是从同一目录中运行它不工作。
或者,你可以在bash定义以下功能:
realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
此功能需要1个参数。如果参数已经是绝对路径,则按原样打印它,否则打印$PWD
变量+文件名参数(不带前缀./
)。
或这里是Debian的.bashrc
文件所采取的版本:
function realpath()
{
[email protected]
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
相关:
How to detect the current directory in which I run my shell script?
Reliable way for a bash script to get the full path to itself?
参见:
比流行的更好的答案,因为它解决了系统链接,并占了不同的操作系统。谢谢! – 2013-10-03 17:08:12
感谢您的回答。在我的Mac上工作的第一个......但是,在“cp”命令中,@ switchorb是怎么做的? – TobyG 2014-06-12 07:18:10
在命令中使用双短划线('--')来表示命令选项的结尾,因此包含破折号或其他特殊字符的文件不会破坏命令。尝试通过'touch'-test“'和'touch - -test'创建文件,然后通过'rm -test'和'rm - -test'删除文件,并查看其差异。 – kenorb 2014-06-12 08:15:32
cd "`dirname $(readlink -f ${0})`"
你能解释你的答案吗? – Zulu 2015-10-27 12:31:46
虽然这段代码可能有助于解决问题,但它并没有解释_why_和/或_how_它是如何回答问题的。提供这种附加背景将显着提高其长期教育价值。请[编辑]您的答案以添加解释,包括适用的限制和假设。 – 2016-10-24 16:16:40
echo $PWD | rev | cut -d'/' -f1 | rev
- 1. 将工作目录更改为当前脚本的目录
- 2. 如何设置当前工作目录?
- 3. 将vim当前工作目录设置为当前项目根目录或当前文件的目录
- 4. 设置当前目录 - 苹果脚本
- 5. 如何在PHP中将当前工作目录设置为脚本执行目录?
- 6. WebStorm Dart设置当前工作目录
- 7. Ocaml:设置当前工作目录?
- 8. 设置脚本的工作目录
- 9. 如何将NAnt项目的basedir设置为当前目录?
- 10. 如何将当前目录作为参数传递给脚本?
- 11. 将JFileChooser当前目录设置为远程目录
- 12. 将目录设置为脚本路径
- 13. Shell脚本当前目录?
- 14. PHP:如何设置当前工作目录与执行脚本的目录相同
- 15. 如何在R markdown中将当前文件位置设置为工作目录?
- 16. SHAutoComplete&当前工作目录?
- 17. vimrc - 当前工作目录
- 18. 如何在Vim中设置工作/当前目录?
- 19. 如何在Python sh模块中设置当前工作目录?
- 20. 如何在Python中自动设置当前工作目录
- 21. 如何在Dart中设置当前工作目录?
- 22. 如何更改当前工作目录
- 23. 如何获得当前工作目录
- 24. 如何将工作目录设置为C++中的“解决方案目录”
- 25. 如何检测当前工作目录是否为Rails项目根目录
- 26. 如何设置WinGHCi的工作目录
- 27. SWI Prolog更改工作目录/获取当前工作目录?
- 28. 将工作目录设置为SublimeREPL中活动脚本的位置
- 29. Shell脚本中的当前目录
- 30. 如何将当前工作目录更改为特定目录并在特定目录下执行程序?
您是否曾考虑将包装脚本放在/ usr/bin之类的某个位置,以便将光盘放入(硬编码)适当的目录中,然后执行脚本? – 2010-07-28 01:02:56
为什么你需要脚本的目录?可能有更好的方法来解决潜在的问题。 – bstpierre 2010-07-28 03:59:02
我只想指出,你称之为“显然不可取”的行为实际上是完全必要的 - 如果我运行'myscript path/to/file'我期望脚本评估相对于MY的路径/到/文件当前目录,而不是脚本恰好位于的目录。另外,BASH常见问题解答中提到的使用'ssh remotehost bash <./ myscript'运行的脚本会发生什么? – 2010-07-28 04:54:50