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

问题描述 投票:4回答:4

我有一个脚本“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中安排脚本时,它也不能正常工作。有人可以告诉我我做错了什么或以不同的方式获取不是当前目录的脚本目录?

bash shell argv
4个回答
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
投票

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

请尝试以下方法:

#!/bin/bash

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

1
投票

当你打字时,

bash foo.sh

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

当你打字时,

. foo.sh

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

SCRIPTPATH=$(dirname "$_")

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

感谢Dennis Williamson为类似的question提供这个答案。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.