【问题标题】:Running shell scripts with ./ dot-slash [duplicate]使用 ./ 点斜杠运行 shell 脚本 [重复]
【发布时间】:2013-06-30 06:43:40
【问题描述】:

我正在处理一个文件处理项目,我正在尝试在 PuTTY 中运行一个名为 runProcessing.sh 的 shell 脚本。服务器使用 ksh。我的主管告诉我在执行脚本时使用./ runProcessing.sh <param1> <param2>,但每当我使用./ 时,它都会显示cannot executefile not found。每当我只输入runProcessing.sh 时,它都会返回空指针异常,我现在一直在努力继续我的任务。

我了解 ./ 在运行脚本时的作用,但我不确定为什么在尝试使用它运行我的脚本时它不起作用。任何提示或建议?我是 Linux/UNIX 的新手。

这是我的脚本:

#!/bin/ksh
#
# Script to download processing files from the appropriate target
#
# $Id: runProcessing.sh 604 2013-01-14 21:56:35Z alex_rempel $
#

DIR=`dirname $0`
. $DIR/setEnvironment.sh
java $LDAPRUNMODE $JAVAOPT com.webproject.db.processing.FPJob  --logdir $CISLOGDIR --file [2] $* 
RET=$?

if [ $RET -gt 0 ]
then
    echo
    echo
    echo "------ runProcessing.sh Failed ------"
    echo
    echo
    exit $RET

【问题讨论】:

  • ./something(将当前目录指定为查找内容的位置)和. something(在当前 shell 中运行某些内容而不是作为子进程)都有意义。 ./ something 无效。
  • ...顺便说一下,您的脚本无效,因为它有一个 if 而没有 fi。您还需要引用您的扩展,并且不应该使用$? - 这里没有意义。 if ! java ...; then ...; fi 就足够了,没有理由存储 $RET。此外,对环境变量和内置函数以外的任何内容都使用大写字母是不好的形式。 (依靠字符串拆分让人们传入参数列表是尤其是不好的形式,但它在启动 Java 应用程序的脚本中几乎无处不在......几乎所有这些都是由没有使用过的人编写的关于 shell 的一点点线索)。
  • 在我的辩护中,我根据公司构建中类似过程的类似脚本建模了我的脚本,所以请原谅我的任何不良形式。

标签: bash shell unix scripting putty


【解决方案1】:

空指针异常来自您的 Java 程序,因此它们意味着该进程实际上已经启动。通常,它们并不表示您的 shell 脚本或其调用存在问题。

. something # this reads the file `something`, running each line as a command
            # in your current shell. (Actual behavior is a bit more sophisticated
            # than that, but it's close enough).

./something # this tries to run the file `something` in the current directory as
            # an executable. It doesn't need to be a shell script -- it can be
            # any kind of executable, and if it has a shebang line, that will be
            # honored to determine the interpreter or shell to use.

./ something  # <- this is simply invalid.

也就是说,您可以通过像这样启动脚本来准确记录脚本正在运行的命令:

ksh -x ./something

这将显示您的脚本运行的命令。如果错误是由错误启动 JVM 的脚本引起的,那么您可以确定预期调用和实际调用有何不同。

【讨论】:

  • 这帮助我弄清楚脚本中是否有任何问题,结果证明除了在 if 语句末尾缺少 fi 之外,一切都很好(足够了)。我现在大部分问题都已经解决了,我在执行脚本时没有将正确的参数传递给脚本。谢谢!
【解决方案2】:

由于您在 ksh 环境中运行,因此您还有另一个选择,即使用 ./ 运算符。

您可以通过将脚本作为参数传递给 ksh 来执行它,而不是使您的脚本成为可执行文件,如下所示:

ksh yourScript

当您在 Unix/Linux 中创建文件时,它不会自动获得执行权限。因此,或者,您可以使用chmod 修改脚本的权限:

chmod +x yourScript

然后您应该能够执行您的脚本。

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2019-01-07
    • 2020-02-02
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多