curl --данные -двоичный файл $' внутри сценария оболочки

Обычно _startявляется точкой входа, а не основной.

main— это просто еще одна подпрограмма, она вызывается _start. Она получает кадр стека -в стеке, как и любая другая подпрограмма.

Однако ядро ​​не так много делает, как вы думаете. В процессе есть код, запущенный перед основным (и _startон генерируется компилятором C, но не является частью программы C ), которая многое делает. Существует даже код, выполняемый передexec(до того, как программа C запустит ), например, установка stdin, stdoutи stderr.

Ядро может делать некоторые трюки с _start, ее нельзя запускать, как другие подпрограммы, но она будет выглядеть так, как будто она :Ядро настроит процесс так, как если бы _entryбыл только что вызван (, но это не было ). Если управление возвращается к _start, то вызывается exit.

(Возможно, я упустил некоторые детали, в том числе _entry).

2
30.06.2020, 12:50
2 ответа

Оператор кавычек $"..."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\"..."

См. Как использовать специальный символ вместо обычного? для получения подробной информации о различных операторах кавычек в различных оболочках.

7
18.03.2021, 23:23

Итак, я думаю, что вы хотите в основном это:

$ 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"
2
18.03.2021, 23:23

Теги

Похожие вопросы