Почему эта строка Shell работает в eval(), но не получается в bash

Выработал простой скрипт Shell, как показано ниже:

#!/bin/sh
SHOWIT="echo \"a b c\""
GETIT="cut -f 3 -d' '"
echo "$SHOWIT|$GETIT"
eval "$SHOWIT|$GETIT"
$SHOWIT|$GETIT

Выражение "$ SHOWIT | $ GETIT" работало с помощью eval, но удаляло ошибку, когда оно напрямую передавалось команде Shell.

echo "a b c"|cut -f 3 -d' '
c
cut: ': No such file or directory <== Hit error at here

BTW, моя оболочка по умолчанию - BASH 4.1.2 на RHEL6.3.

#bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

Кто-нибудь может помочь найти основную причину ошибки? Большое спасибо.

1 ответ

Поскольку с помощью eval ваша команда будет выглядеть так:

echo "a b c" | cut -f 3 -d' '

Но только с разбиением слова ваша команда такова:

echo "\"a" "b" "c\"" | cut "-f" "3" "-d'" "'"

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

licensed under cc by-sa 3.0 with attribution.