5

我有一个包含以下内容的脚本“task.sh”:

#!/bin/bash

CUR_DIR=`pwd`
SCRIPTPATH="${CUR_DIR}/`dirname $0`"

当我用“bash task.sh”调用它时,它按预期工作,但是当它用“.task.sh”调用时

$ . log/task.sh 
dirname: invalid option -- b
Try `dirname --help' for more information.

在 crontab 中安排脚本时,它不能正常工作。有人可以告诉我我做错了什么或以不同的方式来获取不是当前目录的脚本目录吗?

4

4 回答 4

7

当您调用它时bash task.sh,bash 将“task.sh”分配给 $0(来自bash 手册:“如果使用命令文件调用 Bash [...] $0 设置为该文件的名称。”)。

当您获取文件时,bash 不会更改 $0,它只是在当前环境中执行脚本。在您当前的环境中,0 美元是什么?

$ echo "$0"
-bash

前导破折号将被解释dirname为一个选项。

如果它在一个 cron 工作中,你为什么要采购它?

如果您需要获取脚本,如果您的 shell 是 bash,这将起作用:

SCRIPTPATH="${CUR_DIR}/${BASH_ARGV[0]}"

但是,我相信 cron 的 shell 是 /bin/sh。即使 /bin/sh 是 bash 的符号链接,当 bash 作为 sh 调用时,它也会尝试表现 POSIXly:BASH_ARGV 数组可能对您不可用。

于 2011-04-18T20:28:55.947 回答
1

没有理由在使用 bash 时pwd调用外部二进制文件。dirname这两个二进制文件的功能可以用纯 shell 语法复制。

尝试以下操作:

#!/bin/bash

CUR_DIR="$PWD"
SCRIPTPATH="${CUR_DIR}/${0#*/}"
于 2011-04-18T20:21:17.660 回答
1

打字时,

bash foo.sh

您正在执行脚本 foo.sh,并且 bash 将输入参数 $0 设置为正在运行的脚本的名称。

打字时,

. foo.sh

您正在采购脚本并且未设置输入参数 $0。在这种情况下,您可以使用包含最后执行命令的参数的自动变量 $_。在您的脚本中,您可以键入,

SCRIPTPATH=$(dirname "$_")

获取 foo.sh 的路径。请注意,要使其工作,这必须是文件中执行的第一个命令。否则 $_ 将不包含源脚本的路径。

感谢Dennis Williamson为类似问题提供了这个答案。

于 2014-03-05T09:21:15.047 回答
0

我已经使用了很长时间没有问题。

SCRIPTPATH=$(cd `dirname -- $0` && pwd)

禁用参数的--进一步处理。

于 2018-09-05T09:15:06.540 回答