Есть ли для bash что-то вроде perls __DATA__? - PullRequest
12 голосов
/ 13 августа 2010

Есть ли для bash что-то вроде perls __DATA__?Я имею в виду особенность, что код после __DATA__ не будет выполнен.

Ответы [ 3 ]

18 голосов
/ 13 августа 2010

Сценарии оболочки анализируются построчно по мере их выполнения, поэтому вам просто нужно убедиться, что выполнение никогда не достигнет данных, которые вы хотите защитить. Вы можете сделать это, например:

# Some shell code...

exit

[data (possibly binary) goes here]

Чтобы на самом деле прочитать эти данные из вашего скрипта, вы можете использовать некоторую магию sed, чтобы извлечь все после первой строки, содержащей только __DATA__, а затем сохранить вывод этого sed в переменной. Вот пример:

#!/bin/sh

data=$(sed '0,/^__DATA__$/d' "$0")
printf '%s\n' "$data"

exit

__DATA__
FOO BAR BAZ
LLAMA DUCK COW

Если вы сохраните этот скрипт как test-data.sh и сделаете его исполняемым, вы можете запустить его и получить следующий вывод:

$ ./test-data.sh
FOO BAR BAZ
LLAMA DUCK COW
3 голосов
/ 13 августа 2010

Прежде всего, прагма perl "__DATA__" - это способ ввода данных в $ _ без указания файла. В bash нет аналога, так как он не имеет ничего общего с $ _. Однако вы можете предоставить данные непосредственно в скрипте bash другими способами, такими как явное задание переменных, использование документов HERE и т. Д.

Однако я не уверен, что это то, что вы хотите сделать. Кажется, после какого-то блочного комментирования. Это тот случай?

0 голосов
/ 08 июля 2017

Это полезный метод, если вы хотите предоставить информацию об использовании вашего скрипта, но не хотите загромождать основную строку кода текстом справки.Также замечательно, если вы хотите ссылаться на использование более одного раза.Для примера, фрагмент из моего скрипта:

...
declare OPTSARGS    
OPTSARGS=$(getoptp -o wh --long nopager,help -n myScript-- "$@")
status=$? 
if ((status != 0))    
then
    printf '%s\n' "$(sed '0,/^__USAGE__$/d' $0)"
    exit $status
fi
eval set -- "$OPTSARGS"  
while true
do
    case "$1" in
        -w) diffargs="$diffargs -w"; shift;;
        --nopager) pager=cat; shift;;
        --) shift; break ;; ## end of opts, remaining $*, if any, are args
        -h | --help)
            printf '%s\n' "$(sed '0,/^__USAGE__$/d' $0)"
            exit 0;;
        *)
            echo "Internal error!"
            printf '%s\n' "$(sed '0,/^__USAGE__$/d' $0)"
            exit 1;;
   esac
done

...

echo "Done"
exit 0

__USAGE__
myScript [-w] [--nopager] [file [file...] ]

Some description goes here.

       -w - Do not compare whitespace
--nopager - Do not pass the output through 'less'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...