【问题标题】:Bash Script is not working [closed]Bash 脚本不起作用[关闭]
【发布时间】:2018-07-02 01:46:41
【问题描述】:

当我写这样的脚本时

#!/bin/sh                                                                       

pidof MX-CM48 | xargs kill                                                      

if [ -f /home/root/MX-CM48NEW ]; then                                           
    mv /home/root/MX-CM48NEW /home/root/MX-CM48                                 
    chmod 777 /home/root/MX-CM48                                                
fi                                                                              

cd /home/root                                                                   
./MX-CM48 &     

脚本正在运行。

但是当我尝试这样写时:

#!/bin/sh
NEW_FILE="/home/root/MX-CM48NEW"
OLD_FILE="/home/root/MX-CM48"
PATH="/home/root"
APP_NAME="MX-CM48"

pidof $APP_NAME | xargs kill

if [ -f $NEW_FILE ]; then
    mv $NEW_FILE $OLD_FILE
    chmod 777 $OLD_FILE
fi

cd $PATH
./$APP_NAME &

pidof 和 if 不起作用。

【问题讨论】:

标签: linux bash if-statement


【解决方案1】:

PATH 环境变量定义了系统在何处查找与命令对应的可执行文件。这是一个以冒号分隔的包含可执行文件的目录列表,例如/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin。所以当你使用像mv这样的命令时,系统会在/usr/local/bin中查找名为“mv”的文件,然后在/usr/bin中,然后在/bin等中。

当您在脚本中将PATH 设置为“/home/root”时,这将成为系统查找命令可执行文件的唯一位置。我想这根本不是你想要的。

解决方案很简单:为变量使用不同的名称。实际上,最好为你的东西使用小写或混合大小写的变量名,因为有很多全大写的变量名具有某种特殊含义,很难记住和避免所有这些。

顺便说一句,您应该(几乎)总是用双引号引用变量引用,例如pidof "$APP_NAME" 以避免 shell 解析未引用变量的方式产生意外的怪异。最后,当您在脚本中使用cd 时,您应该始终检查错误;否则如果cd命令失败,脚本的其余部分会在错误的地方盲目地继续执行。

cd "$path" || {
    echo "Error moving to $path directory; giving up" >&2
    exit 1
}
"./$app_name" &

【讨论】:

    【解决方案2】:

    除非您将所有命令复制到/home/root,否则很明显出了什么问题。

    PATH="/home/root"
    

    应该(可能)是:

    PATH="$PATH:/home/root"
    

    或使用完整的路径名,例如:

    /usr/bin/pidof $APP_NAME | /usr/bin/xargs /bin/kill
    

    【讨论】:

    • 不是正确的答案——$PATH 变量有特殊含义,你不应该尝试将它用于其他用途。
    • 我假设,/home/root 中有一些从脚本调用的可执行文件,因此,它必须附加到现有 PATH;因此“可能”。我同意您的解释更详细,因此可能对理解 PATH 的含义更有帮助。