在shell脚本中引用当前目录

19

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

我有一个脚本,需要调用同一目录下的另一个脚本:

#! /bin/sh

#Call the other script
./foo.sh 

# do something ...

我得到了这个错误:./foo.sh: 没有那个文件或目录

所以我将其更改为:

#! /bin/sh

#Call the other script
foo.sh 

# do something ...

但是这样会调用在PATH中默认的foo脚本,这不是我想要的。

所以问题是,如何在Shell脚本中引用./的语法?


1
./ 表示 _当前工作目录_,而不是 _存储当前执行脚本文件的目录_。我不确定是否有任何机制可以获取包含当前执行脚本的目录。但如果您的第一个脚本在 PATH 中,那么第二个脚本也在其中... - sarnold
6个回答

26

如果两个脚本都在同一个目录中,但是当你收到./foo.sh: No such file or directory错误时,最有可能的原因是你从与它们所在的不同目录运行了第一个脚本。请在第一个脚本中添加以下内容,以便无论您从哪里调用第一个脚本,都可以调用 foo.sh

my_dir=`dirname $0`
#Call the other script
$my_dir/foo.sh

你如何处理目录名称中的空格?它会抛出一个错误。 - roosevelt
1
目录的完整路径为 $PWD/$my_dir - Marcello DeSales
https://github.com/marcellodesales/docker-puller/blob/master/dockerpuller/scripts/testing.sh#L8 - Marcello DeSales
2
请注意,使用源脚本时 $0 的效果与预期不同。对于 bash,有 BASH_SOURCE 可以替代 $0,并且可以按照预期工作。 - Alex Che

7
以下代码适用于空格,并且不需要使用bash即可运行:
#!/bin/sh

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

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

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

SCRIPTDIR=`cd "$(dirname "$0")" && pwd`

1

script_dir="${BASH_SOURCE%/*}" # 从 BASH_SOURCE 中删除最后一个 / 和文件名


将脚本目录存储在变量 script_dir 中。

$script_dir/foo.sh

参考: 上述Alex Che的评论。


1
这可能会对您有所帮助: {{link1:Unix shell脚本找出脚本文件所在的目录?}}
但正如sarnold所说,"./"是用于当前工作目录。

1

0

如果您的脚本所在的目录路径中包含空格,那么已接受的解决方案将无法正常工作。

如果能够使用 bash,那么以下方法对我有效:

#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
"${SCRIPTDIR}/foo.sh"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接