Обычной идеей было бы запустить команду и затем использовать $?
для получения кода выхода.Однако иногда у вас есть несколько случаев, когда вам нужно получить код выхода.Например, вам может потребоваться скрыть его вывод, но все равно вернуть код выхода или вывести как код выхода, так и вывод.
ec() { [[ "$1" == "-h" ]] && { shift && eval $* > /dev/null 2>&1; ec=$?; echo $ec; } || eval $*; ec=$?; }
Это даст вам возможность подавить вывод команды, для которой вы хотите код выхода.Когда вывод для команды подавлен, код выхода будет напрямую возвращен функцией.
Мне лично нравится помещать эту функцию в мой .bashrc
файл
Ниже я продемонстрирую несколькоспособы, которыми вы можете использовать это:
# In this example, the output for the command will be
# normally displayed, and the exit code will be stored
# in the variable $ec.
$ ec echo test
test
$ echo $ec
0
# In this example, the exit code is output
# and the output of the command passed
# to the `ec` function is suppressed.
$ echo "Exit Code: $(ec -h echo test)"
Exit Code: 0
# In this example, the output of the command
# passed to the `ec` function is suppressed
# and the exit code is stored in `$ec`
$ ec -h echo test
$ echo $ec
0
Решение вашего кода с помощью этой функции
#!/bin/bash
if [[ "$(ec -h 'ls -l | grep p')" != "0" ]]; then
echo "Error when executing command: 'grep p' [$ec]"
exit $ec;
fi
Следует также отметить, что код выхода, который вы увидите, будет для команды grep
, которая выполняется, поскольку это последняя выполняемая команда.Не ls
.