Задайте команду переменной в проблеме скрипта bash - PullRequest
0 голосов
/ 13 мая 2019

Попытка выполнить команду как переменную, но я получаю странные результаты

Ожидаемый результат "1":

grep -i nosuid /etc/fstab | grep -iq nfs 
echo $?
1

Неожиданный результат в виде переменной команды:

cmd="grep -i nosuid /etc/fstab | grep -iq nfs"
$cmd
echo $?
0

Кажется, он возвращает 0, так как команда была правильной, а не фактическим результатом. Как сделать это лучше?

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Вы можете выполнить только одну команду, хранящуюся в переменной. Канал передается в качестве аргумента первому 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'

Первый аргумент - это описание журнала, остальные аргументы - команда, которую нужно выполнить.

1 голос
/ 13 мая 2019

с использованием bash -x или set -x позволит вам увидеть, что выполняет bash:

> cmd="grep -i nosuid /etc/fstab | grep -iq nfs"
> set -x
> $cmd
+ grep -i nosuid /etc/fstab '|' grep -iq nfs

, поскольку вы можете видеть, что ваш канал | передается в качестве аргумента первой команде grep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...