Bash 在函数Shell脚本中运行命令

Bash 在函数Shell脚本中运行命令,bash,shell,sh,Bash,Shell,Sh,我在这里不知所措。我正在尝试创建一个脚本来自动化一些事情。我有一个函数exitfn()它应该捕获ctrl+c并执行。我这样做是因为,如果你看,在函数下面,这个操作有时会挂起,我只需要运行它。它没有完成,所以我告诉用户按ctrl+c,它应该运行该函数,但我得到的结果是: /bin/grep:/var/lib/mrtg/cfgs/.cfg:没有这样的文件或目录 我的想法: 它是否正确运行了第一个comman 我是不是把整个陷阱都用错了 #!/bin/bash echo "Enter the nam

我在这里不知所措。我正在尝试创建一个脚本来自动化一些事情。我有一个函数exitfn()它应该捕获ctrl+c并执行。我这样做是因为,如果你看,在函数下面,这个操作有时会挂起,我只需要运行它。它没有完成,所以我告诉用户按ctrl+c,它应该运行该函数,但我得到的结果是:

/bin/grep:/var/lib/mrtg/cfgs/.cfg:没有这样的文件或目录

我的想法:

  • 它是否正确运行了第一个comman
  • 我是不是把整个陷阱都用错了

    #!/bin/bash
    echo "Enter the name of the device: > "
    read dName
    echo "Now enter device type [cpu, ram, : > "
    read dType
    echo "Enter the devices actual value with % symbol: > "
    read aValue
    echo "Enter the desired threshold with % symbol: > " 
    read dValue
    echo "Grounding..." 
    n=`locate thresholdHandler.pl`
    cd ${n%thresholdHandler.pl}
    echo "Hit Ctrl+C to continue......"
    
    exitfn() {
        trap SIGINT
        echo; 
            echo "Running second command, wait 3 seconds"  
            sleep 3
            ./thresholdHandler.pl output above $dname.$dType $dValue $aValue
            echo "Complete"
        exit
    }
    
    trap "exitfn" INT
    ./thresholdHandler.pl output above $dName.$dType $aValue $dValue
    sleep 10
    trap SIGINT
    

谢谢你抽出时间

您在脚本中使用了太多的
陷阱:)

您的代码应该如下所示:

echo "Hit Ctrl+C to continue......"

exitfn() {
    trap "" SIGINT    #we trap any further ctrl + c and force execution of exitfn
    echo; 
        echo "Running second command, wait 3 seconds"  
        sleep 3
        ./thresholdHandler.pl output above $dName.$dType $dValue $aValue
        echo "Complete"
    exit 0
}

trap "exitfn" SIGINT    #here, only ctrl+c is trapped. Add more signals here if needed
./thresholdHandler.pl output above $dName.$dType $aValue $dValue
sleep 10
一般来说,陷阱的正确用法是
陷阱“指令”信号
。一旦你把这一行放进你的脚本中,陷阱将对下面的所有指令有效(之前的指令不会触发你的陷阱)

如果要在exit函数中强制等待perl脚本的执行,只需捕获SIGINT并不执行任何操作


关于第一点,是的,
thresholdHandler.pl
将运行。但是,如果按CTRL+C(一次是由常规脚本执行,尽管不是完全执行,因为它被SIGINT中断,一次是由exitfn执行,当它被trap调用时),它将运行2次,并使用不同的值(我不知道这是有意的还是复制exmaple时的一个简单输入错误).

最后额外的
fi
是什么?我删除了问题仍然没有解决的信息。我将在我的原始帖子中反映这一点。perl脚本做什么?pl脚本不是问题第一个脚本有效,第二个只是一个变体。是的,这就是我的想法:)我编辑了我的原始答案以解决这一点我只希望下面的一个运行几秒钟,然后你取消,然后第二个运行到结尾。@KirsKringle所以,你希望第一个脚本执行10秒钟,然后中断,然后等待用户按ctrl+c,然后运行退出函数?基本上你拥有的正是我想要的。只要想想pl脚本就是一种审计的东西。第一个有时会运行,但用户知道它会这样做,并且不需要这样做,所以他们会继续并取消它。