То, как я обнаруживаю команду, выполняется, и затем выполните дополнительную команду после текущей команды

varname='*'

Хотя вы должны быть осторожны с тем, где вы его используете; поскольку globbing происходит после расширения переменной, если вы расширите ее небрежно, она будет выполнять операцию glob во время расширения вместо этого. Используйте echo "$varname" для печати (обратите внимание на кавычки).

1
11.08.2018, 16:44
1 ответ

Используйте команду trapв bash.

trap [-lp] [[arg] sigspec...]

If a sigspec is DEBUG, the command arg is executed before every simple command...

Теперь ваша единственная проблема заключается в том, что ваша команда trap запускается до, а не после команды. Но вы можете передать команду для выполнения с помощью $BASH_COMMAND, и вы можете заставить команду не выполняться.

extdebug

  1. If the command run by the DEBUG trap returns a non-zero value, the next command is skipped and not executed.

Поэтому установите ловушку DEBUG, если вы обнаружите интересующую вас команду, выполните $BASH_COMMAND, выполните свою собственную команду, а затем запретите запуск исходной команды.

Редактировать

Попробуйте этот пример:

#!/bin/bash                                                                                                                                                                                                                                                                     

function myfunc ()
{
    if test "$BASH_COMMAND" = "echo 1"; then
        $BASH_COMMAND
        echo "runing after 'echo 1'"
        return 1
    else
        return 0
    fi
}

shopt -s extdebug
trap "myfunc" DEBUG

echo 1
echo 2

Выполнение этого скрипта:

$ bash test.sh
1
runing after 'echo 1'
2
0
28.01.2020, 00:30

Теги

Похожие вопросы