ЗАВИХРЕНИЕ <-функция

Как насчет awk, потому что это не было упомянуто?

awk -F\| '$1~/\w/' file
7
22.07.2013, 07:40
2 ответа

- является наиболее часто используемым для представления стандартного входа и < является наиболее часто используемым для представления перенаправления из файла. Я полагаю, что те синтаксисы прибывают из ранних оболочек. Вместе, они подразумевают взятие в стандартном входе и отправку/перенаправление его в другом месте. Синтаксис является почти естественным.

Смотря на ВИХРЕВУЮ историю пересмотра, < синтаксис был добавлен для ЗАВИХРЕНИЯ в середине 2000. Пересмотр, который добавил эту опцию, доступен как фиксация Мерзавца 5b7a5046e6.

От журнала изменений,

Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
the rfc1867 form posts. He introduced 'name=<file' which brings a means to
suuply very large text chunks read from the given file name. It differs from
'name=@file' in the way that this latter thing is marked in the uploaded
contents as a file upload, while the first is just text (as in a input or
textarea field). Torsten also corrected a bug that would happen if you used
%s or similar in a -F file name.

Нет никакого упоминания о вдохновении или источника этой функции.

@- синтаксис присутствовал в ЗАВИХРЕНИИ в самой ранней версии источника, который я мог найти. От первого пересмотра в конце 1999,

/* postfield data */
if('@' == *nextarg) {
  /* the data begins with a '@' letter, it means that a file name
     or - (stdin) follows */
  FILE *file;
  nextarg++; /* pass the @ */

Трудно определить, является ли это ОПРЕДЕЛЕННЫМ ДЛЯ ЗАВИХРЕНИЯ. Синтаксис является распространенным и естественным. ВИХРЕВОЙ функцией, с которой это связано, является основная функция ЗАВИХРЕНИЯ. Инструменты, подобные ЗАВИХРЕНИЮ, вероятно, реализуют некоторую форму если это.


Исходный вопрос, о котором задают

$ echo foo | curl -d 'sprunge=<-' http://sprunge.us

Здесь был мой ответ:

Я не полагаю, что это - функция ЗАВИХРЕНИЯ.

$ # Terminal A
$ curl --version
curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
$
$ echo foo | curl -d 'sprunge=<-' localhost:2222

$ # Terminal B
$ nc -l 2222
POST / HTTP/1.1
User-Agent: curl/7.31.0
Host: localhost:2222
Accept: */*
Content-Length: 7
Content-Type: application/x-www-form-urlencoded

sprunge=<-

Я не мог найти упоминание об этой функции в ВИХРЕВОЙ документации. Существует подобная функция все же.

Если Вы запускаете данные с буквы, остальные должны быть именем файла для чтения данных с, или - если Вы хотите, чтобы завихрение считало данные с stdin. Содержание файла должно уже быть закодировано URL. Несколько файлов могут также быть указаны. Регистрация данных из файла, названного 'foobar', таким образом была бы, покончили - данные @foobar.

8
27.01.2020, 20:17
  • 1
    Извините, я не скопировал точный вывод. Я выполнил его со словом test но попробованный для изменения его для отражения вопроса. Я исправил свой ответ. –   22.07.2013, 07:31
  • 2
    Да я мог сказать, что Вы совершенствовали ответ, просто указав на тот материал. Мне понравилась Ваша идея в использовании nc протестировать это. Я всегда забываю о мало nc. –  slm♦ 22.07.2013, 07:33
  • 3
    Это находится в моей странице справочника. Искать -d. Я надеюсь, что Вы не возражаете, я не понял то, чем "sprunge = <-" был, пока я не видел Ваш ответ и понял, что это были данные, отправляемые в POST. –  slm♦ 22.07.2013, 07:36
  • 4
    @slm: Спасибо за указание на вещи. Я ценю его. –   22.07.2013, 07:38
  • 5
    Извините, неправильная команда. –  Jürgen Paul 22.07.2013, 07:40

Шпионаж за завихрением с socat

Обновленный вопрос относительно этой команды:

$ cat file | curl -F 'sprunge=<-' http://sprunge.us

Делает несколько вещей. Используя socat мы можем шпионить за запросом как так в одном терминале:

$ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'

Теперь во втором терминале мы будем использовать Ваш curl управляйте для соединения с нашим socat демон. Для cat file мы собираемся использовать это в качестве нашего файла примера:

$ cat hello.txt
msg: hello curl

И когда мы curl:

$ cat ~/hello.txt | curl -Fblah=\<- localhost:2222

Мы видим это в socat вывод:

Content-Disposition: form-data; name="blah"
msg: hello curl

Если мы меняем струну от blah к a - мы будем видеть следующее:

$ cat ~/hello.txt | curl -F-=\<- localhost:2222

Результат:

Content-Disposition: form-data; name="-"

Таким образом, поскольку мы видим, аргумент после начальной буквы -F название формы, против которой мы хотим отправить. Страница справочника для curl mentions that- F' для представления формы HTTP, где мы хотим указать имя:

 -F, --form <name=content>
   (HTTP)  This  lets  curl emulate a filled-in form in which a user
   has pressed the submit button. This causes curl to POST data using
   the Content-Type  multipart/form-data  according  to  RFC  2388.
   This enables uploading of binary files etc. To force the 'content'
   part to be a file,  prefix  the  file  name with  an  @  sign.
   To just get the content part from a file, prefix the file
   name with the symbol <. The difference between @ and < is then
   that @ makes a file  get  attached  in  the  post as a file upload,
   while the < makes a text field and just get the contents for that
   text field from a file.

Остальная часть переключателей к -F-= переключатель подключает вход STDIN к этому аргументу. <-. STDIN будет содержать поток содержания, прибывающего на пути cat file |.

Сравнение args - '-F-=<-' по сравнению с. -F-=\<-

Эти 2 нотации идентичны. Снова мы можем использовать дополнительное многословие для наблюдения то, что происходит.

$ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
...
+ cat /Users/smingolelli/hello.txt
+ curl '-F-=<-' localhost:2222

Принимая во внимание, что другой метод:

$ set -x; cat ~/hello.txt | curl -F-=\<- localhost:2222; set +x
...
+ cat /Users/smingolelli/hello.txt
+ curl '-F-=<-' localhost:2222

Людям нравится использовать первый метод, потому что он сохраняет их дополнительный символ во вводе его. Но от curlперспектива, они идентичны. Все это -F-=\<- делает выходит из перенаправления так, чтобы curl добирается для наблюдения его вместо оболочки, обрабатывающей его.


Исходный Quesiton

Исходный вопрос спрашивают об этом:

$ echo foo | curl -d 'sprunge=<-' http://sprunge.us

На который я ответил:

Когда Вы используете переключатель -d для завихрения Вы подразумеваете POST, от curl страница справочника.

-d/--data <data>
     (HTTP) Sends the specified data in a POST request to the HTTP server, 
     in the same way that a browser does  when  a user has filled in an 
     HTML form and presses the submit button. This will cause curl to pass 
     the data to the server using the content-type 
     application/x-www-form-urlencoded.  Compare to -F/--form.
0
27.01.2020, 20:17

Теги

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