2

Я хотел сделать что-то простое в моем сценарии:

set_dryrun()
{
    BEGIN='cat << EOF'
    END='EOF'
}

[ "$1" == "-dryrun" ] && set_dryrun

${BEGIN}
    ls -l
${END}

Так что, если я запущу его с параметром -dryrun , команды между ${BEGIN} и ${END} будут просто напечатаны, но не будут выполнены.

Все идет хорошо, если я запускаю без флага -dryrun :

$ ./dryrun_opt 
-rwxrwxr-x 1 arantesj arantesj 160 jan 25 17:15 dryrun_opt

С -dryrun , однако, я вижу:

$ ./dryrun_opt -dryrun
cat: '<<': No such file or directory
cat: EOF: No such file or directory
-rwxrwxr-x 1 arantesj arantesj 160 jan 25 17:16 dryrun_opt
./dryrun_opt: line 14: EOF: command not found

Что ж... Я не заменяю (расширяю?) мой наследственный правильно я знаю, но как мне быть, если это возможно?

Заранее спасибо.

1 ответ1

1

Это работает для меня:

set_dryrun()
{
    BEGIN='cat << EOF'
    END='EOF'
}

[ "$1" == "-dryrun" ] && set_dryrun

eval "${BEGIN}
    ls -l
${END}"

Однако я подозреваю, что весь этот подход сломается в какой-то момент, когда heredoc станет более сложным, чем 'ls -l' . Если бы внутри происходило процитирование или уклонение, это нужно было сделать осторожно, или такой простой подход мог бы нарушиться.

Исходя из мудрости этого потока переполнения стека, вы можете найти этот подход интересным для рассмотрения:

if [ "$1" == "-dryrun" ]
then
        CMD="cat"
else
        CMD="bash"      # your preferred shell here
fi

WORK="$(cat <<'EOF'
# abc'asdf"
# $(dont-execute-this)
# foo"bar"''
ls -l
echo "$PATH"
echo "\$PATH"
EOF
)"

$CMD <<< "$WORK"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .