Вы можете выполнить только одну команду, хранящуюся в переменной. Канал передается в качестве аргумента первому grep
.
Пример
$ printArgs() { printf %s\\n "$@"; }
# Two commands. The 1st command has parameters "a" and "b".
# The 2nd command prints stdin from the first command.
$ printArgs a b | cat
a
b
$ cmd='printArgs a b | cat'
# Only one command with parameters "a", "b", "|", and "cat".
$ $cmd
a
b
|
cat
Как это сделать лучше?
Не выполнять команду с использованием переменных.
Используйте функцию.
$ cmd() { grep -i nosuid /etc/fstab | grep -iq nfs; }
$ cmd
$ echo $?
1
Решение актуальной проблемы
Я вижу три варианта вашей актуальной проблемы:
- Используйте ловушку
DEBUG
и переменную BASH_COMMAND
внутри ловушки.
- Включите функцию истории bash для вашего скрипта и используйте команду
hist
.
- Используйте функцию, которая принимает командную строку и выполняет ее, используя
eval
.
Что касается вашего комментария к последнему подходу: вам нужна только одна функция. Что-то вроде
execAndLog() {
description="$1"
shift
if eval "$*"; then
info="PASSED: $description: $*"
passed+=("${FUNCNAME[1]}")
else
info="FAILED: $description: $*"
failed+=("${FUNCNAME[1]}")
done
}
Вы можете использовать эту функцию следующим образом
execAndLog 'Scanned system' 'grep -i nfs /etc/fstab | grep -iq noexec'
Первый аргумент - это описание журнала, остальные аргументы - команда, которую нужно выполнить.