To najlepszy sposób na zrobienie tego. Alternatywa użycia -d @message.txtsugerowana w szczególności w drugiej odpowiedzi może zmienić podziały wierszy. --data-binaryz drugiej strony nie (co jest ważne, jeśli chcesz zachować
podziały wierszy
8
Ponieważ zajęło mi to sekundę: jeśli przesyłasz plik, prawdopodobnie będziesz chciał użyć do tego podpowłokicurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
Nie udało mi się uruchomić --data-binary, ale udało mi się użyć odpowiedzi znaku% 0A (patrz @malcolmocean). Kiedy używam --data-binary "ip = 33.44.55. * \ N5.6.7.8", nie traktuje go jako nowej linii, ale --data "" ip = 33.44.55. *% 0A5.6.7.8 „wysyła nową linię
Paul
51
Twoja skorupa przechodzi \następnie nzamiast nowej linii do zwijania zamiast "my message\n". Bash obsługuje inną składnię ciągu, która obsługuje sekwencje ucieczki, takie jak \ni \t. Aby go użyć, rozpocznij ciąg od $'i zakończ ciąg ':
curl -X PUT -d $'my message\n' http://localhost:8000/hello
U mnie też to zadziałało. Będę musiał się tym bawić, ponieważ nie działa z cudzysłowami podwójnymi, co oznacza, że nie mogę używać apostrofów w ciągu.
Tyler Collier
1
Nie wiem, skąd wziął się pomysł, że jest to „składnia powłoki JavaScript”. Powłoka przechodzi my message\ndosłownie, a nie z dwoma ucieczkami, jak mówisz.
Chris Down,
@ChrisDown, źle mnie zacytowałeś. Powiedziałem „Składnia łańcuchów JavaScript”, a nie „Składnia powłoki JavaScript”. Używam składni ciągów JavaScript, aby wyjaśnić, co mam na myśli w przykładach ciągów. Myślę, że to, o czym mówisz, my message\njest tym samym, co ja nazywam "my message\n".
Benjamin Atkin
2
@BenAtkin Przepraszamy, poślizg freudian. Jednak mój odczyt był nadal poprawny. \nnie ma nic wspólnego z JavaScriptem. W rzeczywistości nic tutaj nie ma nic wspólnego z JavaScriptem.
Chris Down,
Używam go w celu wyjaśnienia ludziom. I wydaje się, że zadziałało. Składnia łańcucha powłoki nie jest szeroko rozumiana. Gdyby tak było, dlaczego zadawano by to pytanie? Jak powinienem był to wyjaśnić?
Benjamin Atkin
16
Jest o wiele łatwiejszy sposób!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Spowoduje to użycie cytowania ANSI-C do wstawienia znaku nowego wiersza.
Mam problem ze zrozumieniem tego. Rozumiem, że @ma to wskazywać nazwę pliku, ale czy ma jakieś specjalne znaczenie podczas używania @-? Co <<EOFrobisz?
Dennis T - Przywróć Monikę -
1
@-mówi curl, aby konsumował dane wejściowe ze standardu in i <<EOFjest wskaźnikiem końca strumienia dla bash. Następnie używamy magicznego słowa EOFw ładunku danych, aby powiedzieć bashowi, że skończyliśmy pisać do strumienia.
Jammer
Ponadto -w systemie GNU / Linux jest to standardowy sposób określania STDIN, gdy oczekiwana jest nazwa pliku. Nie jest uniwersalny, ale jest dość powszechny.
Rich Remer
Po zapoznaniu się z instrukcją widzimy, że powinien to być tylko - a nie @ -
użytkownik3504575
8
Miałem podobny problem. Podczas przesyłania pliku csv z komputera Mac do chmury usuwano nowe wiersze. Po pobraniu cały plik wyglądał jak jedna linia. Próbowałem dodać różne znaki EOL '\ n' '\ r' '\ r \ n' bez powodzenia. Użycie „--data-binary” zamiast „-d” rozwiązało problem. Przy okazji ten problem wystąpił tylko z komputerów Mac. „-d” działało dobrze podczas wykonywania połączenia z komputera CentOS. To bardzo wygląda ze względu na znak nowej linii Maca. Ale nie chcę już debugować.
Bardzo dziękuję za Twoją pomoc.
curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"
VS
curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
Wielkie dzięki ! Nie jest to związane z twoim komputerem Mac: miałem dokładnie ten sam problem w systemie Linux, a użycie --data-binary @rozwiązało mój problem (wysłanie pliku wielowierszowego .ics na serwer CalDAV).
M-Jack
7
(Skończyłem z nieco innym pytaniem, więc po prostu opublikuję swoją odpowiedź, ponieważ może to pomóc przyszłym odkrywcom)
Moje rozwiązanie dotyczy osób, które wysyłają dane w formie formularza, tj. Pary klucz / wartość w ciągu zapytania. Użyj zakodowanego podziału wiersza, czyli %0Atakiego samego, jak zakodowana spacja %20. Możesz użyć http://meyerweb.com/eric/tools/dencoder/, aby przekonwertować inne symbole.
Więc jeśli chcesz ustawić klucz messagena wartość:
drobny komentarz (może literówka) dla znaku końca wiersza / powrotu znaku powinien to być% 0A zamiast% A0
Paul
3
Nie jest to odpowiedź na twoje pytanie, ale obejdę to, tworząc tymczasowy plik zawierający wiadomość i podział wiersza, i daję curlowi ten plik do pracy:
curl -X PUT -d @message.txt http://localhost:8000/hello
Jeśli zaczynasz dane od litery @, reszta powinna być nazwą pliku, z którego dane będą odczytywane, lub - jeśli chcesz, aby curl odczytał dane ze stdin. Zawartość pliku musi być już zakodowana w formacie URL. Można również określić wiele plików. Wysyłanie danych z pliku o nazwie „foobar” odbywałoby się zatem za pomocą opcji --data @foobar.
Korzystanie z plików tymczasowych jest wygodnym podejściem. Zgodnie z odpowiedzią Szocske, --data-binaryjest bardziej wierną alternatywą -d, ponieważ przesyła dane dosłownie.
William Denniss
7
-1; Użycie pliku tymczasowego w programie -d @/path/to/temp/file.txtNIE rozwiązuje problemu łamania linii. --data-binaryrobi, patrz wyżej.
Frank Olschewski
Jeśli widzisz to, ponieważ zastanawiasz się, dlaczego polecenia curl nie działają po uaktualnieniu curl lub uaktualnieniu do systemu Windows 10, upewnij się, że dodałeś cudzysłowy wokół odniesienia do pliku. Na przykład: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Moje skrypty do przebudowy funkcji Flexiblesearch przestały działać.
joezen777
3
Bardzo łatwy sposób, po prostu Shift-Enter w konsoli na przerwę. Bardzo czytelne wpisywanie.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
\n\ndziałał w Gmailu, ale \nzostał zignorowany. Próbowałem podwoić ucieczkę i inne sugestie. Próbowałem też \r\ni to też nie działało w Gmailu. Uwaga: nie zawracałem sobie głowy testowaniem innych klientów poczty e-mail, być może był to problem związany z Gmailem.
W końcu dałem się szuka rozwiązania i włączeniu text/plaindo text/htmli po prostu używane <br />tagi.
Ktoś zasugerował, że Sendgrid konwertuje zwykły tekst na HTML, jeśli masz włączony piksel śledzący, co ma sens. Być może znaki nowej linii zostały zniszczone w procesie konwersji zwykłego tekstu na HTML. Zakładam, że klient chce piksela śledzącego, więc zdecydował się przejść na HTML.
Odpowiedzi:
Czasami chcesz podać dane do wysłania dosłownie.
Ta
--data-binary
opcja to robi.źródło
-d @message.txt
sugerowana w szczególności w drugiej odpowiedzi może zmienić podziały wierszy.--data-binary
z drugiej strony nie (co jest ważne, jeśli chcesz zachowaćcurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Twoja skorupa przechodzi
\
następnien
zamiast nowej linii do zwijania zamiast"my message\n"
. Bash obsługuje inną składnię ciągu, która obsługuje sekwencje ucieczki, takie jak\n
i\t
. Aby go użyć, rozpocznij ciąg od$'
i zakończ ciąg'
:Zobacz cytowanie ANSI-C w podręczniku Bash Reference Manual
źródło
my message\n
dosłownie, a nie z dwoma ucieczkami, jak mówisz.my message\n
jest tym samym, co ja nazywam"my message\n"
.\n
nie ma nic wspólnego z JavaScriptem. W rzeczywistości nic tutaj nie ma nic wspólnego z JavaScriptem.Jest o wiele łatwiejszy sposób!
Spowoduje to użycie cytowania ANSI-C do wstawienia znaku nowego wiersza.
Bez rurociągów, bez plików danych. Zobacz także Wysyłanie nowych linii z cURL .
źródło
Rozwiązaniem dla kogoś, kto nie chce używać plików i nie chce uciekać się do magii ucieczki powłoki, jest:
Ale to są dosłowne znaki nowej linii w ładunku danych post, a nie w polach formularza.
źródło
@
ma to wskazywać nazwę pliku, ale czy ma jakieś specjalne znaczenie podczas używania@-
? Co<<EOF
robisz?@-
mówi curl, aby konsumował dane wejściowe ze standardu in i<<EOF
jest wskaźnikiem końca strumienia dla bash. Następnie używamy magicznego słowaEOF
w ładunku danych, aby powiedzieć bashowi, że skończyliśmy pisać do strumienia.-
w systemie GNU / Linux jest to standardowy sposób określania STDIN, gdy oczekiwana jest nazwa pliku. Nie jest uniwersalny, ale jest dość powszechny.Miałem podobny problem. Podczas przesyłania pliku csv z komputera Mac do chmury usuwano nowe wiersze. Po pobraniu cały plik wyglądał jak jedna linia. Próbowałem dodać różne znaki EOL '\ n' '\ r' '\ r \ n' bez powodzenia. Użycie „--data-binary” zamiast „-d” rozwiązało problem. Przy okazji ten problem wystąpił tylko z komputerów Mac. „-d” działało dobrze podczas wykonywania połączenia z komputera CentOS. To bardzo wygląda ze względu na znak nowej linii Maca. Ale nie chcę już debugować.
Bardzo dziękuję za Twoją pomoc.
VS
źródło
--data-binary @
rozwiązało mój problem (wysłanie pliku wielowierszowego .ics na serwer CalDAV).(Skończyłem z nieco innym pytaniem, więc po prostu opublikuję swoją odpowiedź, ponieważ może to pomóc przyszłym odkrywcom)
Moje rozwiązanie dotyczy osób, które wysyłają dane w formie formularza, tj. Pary klucz / wartość w ciągu zapytania. Użyj zakodowanego podziału wiersza, czyli
%0A
takiego samego, jak zakodowana spacja%20
. Możesz użyć http://meyerweb.com/eric/tools/dencoder/, aby przekonwertować inne symbole.Więc jeśli chcesz ustawić klucz
message
na wartość:wysłałbyś
źródło
Nie jest to odpowiedź na twoje pytanie, ale obejdę to, tworząc tymczasowy plik zawierający wiadomość i podział wiersza, i daję curlowi ten plik do pracy:
Z instrukcji :
źródło
--data-binary
jest bardziej wierną alternatywą-d
, ponieważ przesyła dane dosłownie.-d @/path/to/temp/file.txt
NIE rozwiązuje problemu łamania linii.--data-binary
robi, patrz wyżej.Bardzo łatwy sposób, po prostu Shift-Enter w konsoli na przerwę. Bardzo czytelne wpisywanie.
Zrób to, aby usunąć podział wiersza:
źródło
Używałem Sendgrid z tym kodem (skopiowanym poniżej) pierwotnie znalezionym tutaj https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
działał w Gmailu, ale\n
został zignorowany. Próbowałem podwoić ucieczkę i inne sugestie. Próbowałem też\r\n
i to też nie działało w Gmailu. Uwaga: nie zawracałem sobie głowy testowaniem innych klientów poczty e-mail, być może był to problem związany z Gmailem.W końcu dałem się szuka rozwiązania i włączeniu
text/plain
dotext/html
i po prostu używane<br />
tagi.Ktoś zasugerował, że Sendgrid konwertuje zwykły tekst na HTML, jeśli masz włączony piksel śledzący, co ma sens. Być może znaki nowej linii zostały zniszczone w procesie konwersji zwykłego tekstu na HTML. Zakładam, że klient chce piksela śledzącego, więc zdecydował się przejść na HTML.
źródło