17

如何在 shell 脚本中引用当前目录?

所以我有这个脚本,它调用同一目录中的另一个脚本:

#! /bin/sh

#Call the other script
./foo.sh 

# do something ...

为此我得到了./foo.sh: No such file or directory

所以我把它改成:

#! /bin/sh

#Call the other script
foo.sh 

# do something ...

但这会调用foo默认情况下位于 PATH 中的脚本。这不是我想要的。

所以问题是,./在 shell 脚本中引用的语法是什么?

4

6 回答 6

24

如果两个脚本都在同一个目录中并且您收到./foo.sh: No such file or directory错误,那么最可能的原因是您从与它们所在的目录不同的目录运行第一个脚本。将以下内容放入您的第一个脚本中,以便调用foo.sh无论您从哪里调用第一个脚本,都可以工作:

my_dir=`dirname $0`
#Call the other script
$my_dir/foo.sh
于 2012-06-06T01:01:22.160 回答
7

以下代码适用于空格,并且不需要 bash 即可工作:

#!/bin/sh

SCRIPTDIR="$(dirname "$0")"

#Call the other script
"$SCRIPTDIR/foo.sh"

此外,如果你想使用绝对路径,你可以这样做:

SCRIPTDIR=`cd "$(dirname "$0")" && pwd`
于 2014-07-16T01:39:47.570 回答
1

这可能对您有所帮助: Unix shell 脚本找出脚本文件所在的目录?

但正如 sarnold 所说,“./”是针对当前工作目录的。

于 2012-06-05T22:45:32.867 回答
1

script_dir="${BASH_SOURCE%/*}" # rm the last / and the file name from BASH_SOURCE

$script_dir/foo.sh

参考:上面 Alex Che 的评论。

于 2018-12-02T15:29:40.583 回答
1

为了使它成为POSIX:

a="/$0"; a=${a%/*}; a=${a:-.}; a=${a#/}/; BASEDIR=$(cd $a; pwd)

在许多与 Bourne 兼容的 shell 上进行了测试,包括 BSD 的。

据我所知,我是作者,我把它放到了公共领域。有关更多信息,请参阅: https ://blog.jasan.tk/posix/2017/05/11/posix_shell_dirname_replacement

于 2017-05-11T15:01:39.373 回答
0

如果您在包含脚本的目录的路径中有空格,则接受的解决方案不起作用。

如果你可以使用 bash,这对我有用:

#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
"${SCRIPTDIR}/foo.sh"
于 2013-12-14T02:22:34.970 回答