脚本全名和路径$ 0在调用时不可见

时间:2011-04-18 20:13:06

标签: bash shell argv

我有一个脚本“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 个答案:

答案 0 :(得分:6)

当你以bash task.sh的形式调用它时,bash会将“task.sh”分配给$ 0(来自bash manual:“如果使用命令文件调用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数组可能无法使用。

答案 1 :(得分:1)

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

尝试以下方法:

#!/bin/bash

CUR_DIR="$PWD"
SCRIPTPATH="${CUR_DIR}/${0#*/}"

答案 2 :(得分:1)

键入时,

bash foo.sh

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

键入时,

. foo.sh

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

SCRIPTPATH=$(dirname "$_")

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

感谢Dennis Williamsonquestion提供此答案。

答案 3 :(得分:0)

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

pattern="[A-Z]{4}[0-9]{7}"

SCRIPTPATH=$(cd `dirname -- $0` && pwd) 禁止进一步处理参数。