Обычно _start
является точкой входа, а не основной.
main
— это просто еще одна подпрограмма, она вызывается _start
. Она получает кадр стека -в стеке, как и любая другая подпрограмма.
Однако ядро не так много делает, как вы думаете. В процессе есть код, запущенный перед основным (и _start
он генерируется компилятором C, но не является частью программы C ), которая многое делает. Существует даже код, выполняемый передexec
(до того, как программа C запустит ), например, установка stdin
, stdout
и stderr
.
Ядро может делать некоторые трюки с _start
, ее нельзя запускать, как другие подпрограммы, но она будет выглядеть так, как будто она :Ядро настроит процесс так, как если бы _entry
был только что вызван (, но это не было ). Если управление возвращается к _start
, то вызывается exit
.
(Возможно, я упустил некоторые детали, в том числе _entry
).
Оператор кавычек $"..."
ksh93 (, также встречающийся в bash
), предназначен для интернационализации сообщений, здесь он вам не нужен.
Чтобы расширить \r\n
, вам нужен$'...'
(также из ksh93, но более широко поддерживаемый ).
Параметры внутри не раскрываются, поэтому вам потребуется:
--data-binary $'....\r\n...name="'"$var1"$'"...\r\n...'
Для --data-binary
и ....<CR><LF>...name="<contents-of-var1>"...<CR><LF>...
(, где <CR>
, <LF>
, <contents-of-var1>
обозначают соответственно управляющий символ возврата каретки , символ перевода строки , также известный как . ] Новая строка управляющий символ и содержимое $var1
переменной )аргументы для передачи в curl
.
То есть используйте $'...'
для частей, где вы хотите, чтобы последовательности \x
были расширены, и "..."
для частей, которые требуют расширения переменных.
Другим вариантом является определение:
CR=$'\r' LF=$'\n' CRLF=$'\r\n'
Или используя стандартный sh
синтаксис:
eval "$(printf 'CR="\r" LF="\n" CRLF="\r\n"')"
и используйте стандарт "..."
для всего этого:
--data-binary "...${CRLF}...name=\"$var1\"..."
См. Как использовать специальный символ вместо обычного? для получения подробной информации о различных операторах кавычек в различных оболочках.
Итак, я думаю, что вы хотите в основном это:
$ cat quote.sh
#!/bin/bash
str=foobar
printf "%s\n" $'str='"$str"$'\nanother line\n'
# <-----><----><-----------------> see below
$ bash quote.sh
str=foobar
another line
. \r\n
изменено на CRLF, а переменные расширены. Как упомянул Стефан, для этого вы должны использовать как $'...'
, так и "..."
. $'...'
интерпретирует экранирование обратной косой черты -, а обычные двойные кавычки расширяют переменные внутри. Ни то, ни другое, и $"..."
все еще отличается (и здесь не используется ). Я отметил три отдельные строки в кавычках выше. Обратите внимание, что если вам нужно поместить буквальные двойные кавычки -в строку, которая будет скручиваться, вы можете просто поместить их, поскольку -находится в одинарных кавычках. $'"\n"'
— это две двойные -кавычки, разделенные новой строкой.
Я спрашивал о запуске скрипта, потому что $'...'
не является стандартной функцией и не поддерживается, например. Dash, который Debian и Ubuntu имеют как /bin/sh
.Таким образом, использование этой оболочки потерпит неудачу:
$ sh quote.sh
$str=foobar$\nanother line\n
Результат немного похож на то, что вы получите в Bash, если поместите $
в одинарные кавычки, например echo '$str=...'
.
Во всех этих случаях $
заключен в кавычки или экранирован и интерпретируется как обычный символ, а не как начало кавычек $'...'
.
--data-binary \$'------Web...'
--data-binary '$------Web...'
--data-binary "$"'------Web...'
--data-binary '$''------Web...'
И если бы вы использовали любой из них с set -x
в действии, Bash действительно вывел бы результирующую строку как'$----...'
:
$ echo --data-binary \$'------Web...'
+ echo --data-binary '$------Web...'
--data-binary $------Web...
На самом деле, поскольку эта строка довольно громоздкая и состоит из нескольких строк, вы также можете строить ее по частям.
Примерно так:
data=
data+=$'------WebKitFormBoundary6AiBMw0TyIybreRa\r\n'
data+=$'Content-Disposition: form-data; name="'"$var1"$'"\r\n'
# ^ *^^ ^^^* ^
# ^ = shell quotes, * = quotes in the resulting string
data+=$'------WebKitFormBoundary6AiBMw0TyIybreRa\r\n'
...
, а затем
curl... --data-binary "$data"