Подтвердить что ты не робот

Есть ли для bash что-то вроде perls __DATA__?

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

4b9b3361

Ответ 1

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

# Some shell code...

exit

[data (possibly binary) goes here]

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

#!/bin/sh

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

exit

__DATA__
FOO BAR BAZ
LLAMA DUCK COW

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

$ ./test-data.sh
FOO BAR BAZ
LLAMA DUCK COW

Ответ 2

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

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

Ответ 3

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

...
declare OPTSARGS    
OPTSARGS=$(getoptp -o wh --long nopager,help -n myScript-- "[email protected]")
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'