我对运行shell脚本的"sh xxx.sh"和"./xxx.sh"之间的区别感到困惑

Jon*_*ang 1 linux bash shell sh

在这里,我有一个名为的shell脚本load.sh.

它启动我的程序名为"演示"与监督,当我运行它sh load.sh start | stop,它运作良好.

但是,当我运行它时./load.sh start | stop,它很糟糕.监督经常启动(并退出)演示.

运行shell脚本的两种方法有什么问题?并且脚本中是否有任何问题(bug)导致监督频繁重启演示?非常感谢!

#!/bin/bash

cd `dirname $0` || exit
mkdir -p status/demo

dir_name=`pwd`
STR_LIB=${dir_name}/lib

if [ -z "${LD_LIBRARY_PATH}" ]; then
    export LD_LIBRARY_PATH="${STR_LIB}"
else
    export LD_LIBRARY_PATH="${STR_LIB}:${LD_LIBRARY_PATH}"
fi

start() {
            sleep 1
            bin/supervise.demo -u status/demo bin/demo >/dev/null 2>&1 &
}

stop() {
            if [ -f status/demo/lock ]; then
                supervise_demo_pid=`/sbin/fuser status/demo/lock`
                `ps -ef | grep "$supervise_demo_pid" | grep "supervise.demo" | grep -v grep > /dev/null 2>&1`
                if [ $? -eq 0 ] && [ "$supervise_demo_pid" != "" ] ; then
                    echo "kill supervise.demo process:"${supervise_demo_pid}
                    kill -9 $supervise_demo_pid
                fi
            fi

            if [ -f status/demo/status ]; then
                demo_pid=`od -An -j16 -N2 -tu2 status/demo/status`
                `ps -ef | grep "$demo_pid" | grep "demo" | grep -v grep > /dev/null 2>&1`
                if [ $? -eq 0 ]; then
                    echo "kill demo process:"${demo_pid}
                    kill -9 $demo_pid
                fi
            fi
}

case "$1" in
        start)
            stop
            start
            echo "Done!"
            ;;
        stop)
            stop
            echo "Done!"
            ;;
           *)
           echo "Usage: $0 {start|stop}"
           ;;
esac
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 7

sh script.sh运行脚本sh,同时运行它./script.sh使用在其第一个"shebang"行上指定的任何内容 - /bin/bash在这种情况下.

sh并且/bin/bash可能是不同的shell,因此它们以不同的方式解释脚本.什么sh是取决于你的分布,$ PATH,别名等.