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

| 我有一个脚本“ 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中计划脚本时,它无法正常运行。 有人可以告诉我我在做错什么还是以其他方式来获取不是当前目录的脚本的目录 ?
已邀请:
当您以“ 2”的形式调用它时,bash将\“ task.sh \”分配给$ 0(从bash手册中:\“如果使用命令文件调用Bash,则$ 0会被设置为该文件的名称。 \“)。 当您获取文件源时,bash不会更改$ 0,它只是在当前环境中执行脚本。您当前的环境中$ 0是多少?
$ echo \"$0\"
-bash
前导破折号将被ѭ4解释为一个选项。 如果它是一项计划工作,为什么要采购呢? 如果您需要获取脚本源代码,那么在您的shell为bash的情况下可以使用此脚本:
SCRIPTPATH=\"${CUR_DIR}/${BASH_ARGV[0]}\"
但是,我相信cron的shell是/ bin / sh。即使/ bin / sh是bash的符号链接,当bash作为sh调用时,它也会尝试POSIXly地运行:BASH_ARGV数组可能对您不可用。
使用bash时没有理由调用诸如as6ѭ和
dirname
之类的外部二进制文件。可以使用纯Shell语法复制这两个二进制文件的功能。 请尝试以下操作:
#!/bin/bash

CUR_DIR=\"$PWD\"
SCRIPTPATH=\"${CUR_DIR}/${0#*/}\"
键入时
bash foo.sh
您正在执行脚本foo.sh,bash将输入参数$ 0设置为正在运行的脚本的名称。 键入时
. foo.sh
您正在采购脚本,并且未设置输入参数$ 0。 在这种情况下,可以使用自动变量$ _,该变量包含最后执行的命令的参数。 您可以在脚本中输入
SCRIPTPATH=$(dirname \"$_\")
获取foo.sh的路径。 请注意,要使其正常工作,它必须是文件中执行的第一个命令。 否则,$ _将不包含源脚本的路径。 感谢Dennis Williamson为类似问题提供了此答案。
我已经使用了很长时间没有问题。
SCRIPTPATH=$(cd `dirname -- $0` && pwd)
--
禁止进一步处理参数。

要回复问题请先登录注册