Условно всухую запусти командный блок с BASH heredoc

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

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

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

j4x
источник

Ответы:

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"
Джим Л.
источник
Большой! Он хорошо работал для моих текущих потребностей, но я буду учитывать (и текст) ваш совет. Спасибо @ Джим-Л.
j4x