Есть ли для bash что-то вроде perls __DATA__
?
Я имею в виду функцию, что код после __DATA__
не будет выполнен.
Есть ли для bash что-то вроде perls __DATA__?
Ответ 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'