Выполнение команды внутри функции Shell Script

Я здесь в недоумении. Я пытаюсь создать скрипт для автоматизации некоторых вещей. У меня есть функция exitfn(), она должна поймать ctrl + c и выполнить. Я делаю это, потому что, если вы смотрите, ниже функции, эта операция иногда зависает, и мне нужно ее запускать. Он не заканчивается, поэтому я говорю, попросить пользователя нажать ctrl + c, и он должен запустить функцию, но вместо этого я возвращаюсь:

/bin/grep: /var/lib/mrtg/cfgs/.cfg: Нет такого файла или каталога.

Мои мысли:

  • Правильно ли он работает с первым *********?
  • Я использую всю ловушку неправильно?

    #!/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 ответ

Вы слишком сильно используете 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 и ничего не выполните.

Что касается вашей 1 - й точки, да, thresholdHandler.pl будет работать. Тем не менее, он будет запущен 2 раза, если вы нажмете CTRL + C (один раз на обычный скрипт, хотя и не полностью, поскольку он перехвачен SIGINT, а один раз - exitfn, когда он вызывается ловушкой), с разные значения (я не знаю, было ли это предназначено или простая опечатка при копировании exmaple).

licensed under cc by-sa 3.0 with attribution.