在函数Shell脚本中运行命令

时间:2014-07-22 08:27:29

标签: bash shell sh

我在这里不知所措。我正在尝试创建一个脚本来自动执行某些操作。我有一个函数 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
    

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

您在脚本中使用trap方式太多了:)

您的代码应如下所示:

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

一般来说,陷阱的正确用法是trap "instructions" SIGNAL[S]。将该行放入脚本后,陷阱将在下面的所有指令中激活(之前的指令不会触发陷阱)。

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

关于你的第一点,是的,thresholdHandler.pl将会运行。但是,如果你点击 CTRL + C ,它会运行2次(一次是通过常规脚本,虽然不完整,因为它是由SIGINT中断的,一次是通过exitfn当它被陷阱调用时,具有不同的值(我不知道这是否是预期的或复制exmaple时的简单错误)。