Linux printf format opcje binarne


Polecenie printf Stranger, jest to bardzo duży temat wymagający doświadczenia - proszę wypełnić brakujące informacje, rozszerzyć opisy i poprawić szczegóły, jeśli możesz Uwaga: dotyczy polecenia printf Bash-builtin, jednakże opis powinien być niemal identyczne dla zewnętrznego polecenia, które następuje POSIX. GNU Awk oczekuje przecinka po ciągu znaków formatu i pomiędzy każdym z argumentów polecenia printf. Przykłady można znaleźć: fragment kodu. W przeciwieństwie do innych dokumentacji, nie chcę przekierowywać cię na stronę podręcznika dla rodziny funkcji C printf (). Jeśli jednak bardziej doświadczony, powinien być najbardziej szczegółowym opisem ciągów i modyfikatorów formatowania. Ze względu na sprzeczne historyczne implementacje polecenia echo, POSIX zaleca, aby printf był preferowany przez echo. Polecenie printf udostępnia metodę drukowania sformatowanego tekstu podobnego do interfejsu systemu printf () (funkcja C). It039s oznacza następcę echa i ma znacznie więcej funkcji i możliwości. Poza innymi powodami POSIX ma bardzo dobry argument, aby go polecić: zarówno historyczne główne smaki polecenia echo są wzajemnie wyłączne, zderzają się. Polecenie quotnewquot musiało zostać wymyślone, aby rozwiązać problem. Format tekstowy podany jest w ltFORMATgt. podczas gdy wszystkie argumenty, które mogą wskazywać na formatstring, są tutaj podane, wskazane przez ltARGUMENTSgt. W ten sposób typowy printf - call wygląda następująco: gdzie nazwaSzczegółem: snName: snquot jest specyfikacją formatu, a dwie zmienne są przekazywane jako argumenty, s w formaciestring wskazuje na (dla każdego nadawcę formatu, printf oczekuje na jeden argument) . Jeśli jest podane, dane wyjściowe są przypisywane do zmiennej VAR zamiast drukowanej na stdout (w podobny sposób do sprintf () w jakiś sposób) Opcja - v może can039t przypisać bezpośrednio do indeksów tablicy w wersjach Basha starszych niż Bash 4.1. W wersjach nowszych niż 4.1 trzeba być ostrożnym przy ekspansji do pierwszego nieopcjonalnego argumentu printf, ponieważ otwiera to możliwość podatności na łatwe wstrzyknięcie kodu. gdzie echo może oczywiście zostać zastąpione dowolnym poleceniem. Jeśli musisz, albo określić ciąg formatowany lub użyj - aby zasygnalizować koniec opcji. Dokładny ten sam problem dotyczy również odczytu. i podobny do pliku mapy. choć przeprowadzanie ekspansji w ich argumenty jest mniej powszechne. Oczywiście w znaczeniu powłoki argumenty są tylko ciągami, jednak powszechne notatki typu C i niektóre dodatki dla stałych liczb są rozpoznawane w celu nadania argumentowi liczbowemu printf. Zasadniczo jest to kwestia przenośności (i niezawodności). Początkowo echo nie akceptowało żadnej opcji i nie rozwijało niczego. Robił wszystko, wyprowadzając argumenty oddzielone znakiem spacji i kończone znakiem nowej linii. Teraz ktoś pomyślał, że byłoby miło, gdybyśmy mogli zrobić coś takiego jak echo nt, aby wypisać znaki nowej linii lub tabulacji, lub mieć opcję, aby nie wyprowadzać znaku nowej linii z końca. Następnie pomyśleli, że jest to trudniejsze, ale zamiast dodawać tę funkcję do powłoki (jak w przypadku perl, gdzie w cudzysłowach, t faktycznie oznacza znak tabulacji), dodali ją do echa. David Korn zdał sobie sprawę z tego błędu i wprowadził nową formę ofert skorupowych:. który został później skopiowany przez bash i zsh, ale do tego czasu było już za późno. Teraz, gdy standardowe echo Unixa otrzymuje argument zawierający dwa znaki i t. zamiast wyprowadzać je, wyprowadza znak tabulacji. A gdy tylko zobaczy c argumentu, przestaje wyprowadzać (tak że końcowy znak nowej linii również nie jest wyprowadzany). Inne powłokiUnix vendorsversions postanowił zrobić to inaczej: dodali opcję - e, aby rozwinąć sekwencje specjalne, oraz opcję - n, aby nie wyprowadzać końcowego znaku nowej linii. Niektóre mają - E, aby wyłączyć sekwencje ewakuacji, niektóre mają - n, ale nie - e. lista sekwencji unikowych obsługiwanych przez jedną implementację echa nie musi być taka sama, jak obsługiwana przez inną. W przypadku tych implementacji echa, które obsługują opcje, na ogół nie ma poparcia dla - aby zaznaczyć koniec opcji (zsh i ewentualnie inne wsparcie - dla tego że), na przykład na przykład trudne do wyjścia - z echo w wielu powłokach. Na niektórych powłokach, takich jak bash 1 lub ksh93 2 lub yash (zmienna ECHOSTYLE), zachowanie zależy nawet od sposobu skompilowania powłoki lub środowiska (zachowanie echa w GNU ulegnie zmianie, jeśli POSIXLYCORRECT znajduje się w środowisku). Więc dwa bash echo, nawet z tej samej wersji basha nie są gwarantowane zachowywać się tak samo. POSIX mówi: jeśli pierwszym argumentem jest - n lub jakikolwiek argument zawiera odwrotne ukośniki, to zachowanie nie jest określone. bash echo w tym względzie nie jest POSIX, na przykład echo - e nie wyprowadza - eltnewlinegt jak wymaga POSIX. Specyfikacja Unix jest surowsza, zabrania - n i wymaga rozszerzania niektórych sekwencji ewakuacyjnych, w tym c, aby zatrzymać wyprowadzanie. Te specyfikacje tak naprawdę nie przychodzą na ratunek, biorąc pod uwagę, że wiele implementacji nie jest zgodnych. W sumie nie wiesz, co echo var będzie wyprowadzane, chyba że możesz upewnić się, że var doesnt zawiera znaki ukośnika ukośnego i nie zaczyna się od -. Specyfikacja POSIX w rzeczywistości mówi nam, aby zamiast tego używać printf. Oznacza to, że nie możesz używać echa do wyświetlania niekontrolowanych danych. Innymi słowy, jeśli piszesz skrypt i bierze on zewnętrzne dane wejściowe (od użytkownika jako argumenty lub nazwy plików z systemu plików), nie możesz użyć echa, aby go wyświetlić. (Chociaż może to działać poprawnie z niektórymi implementacjami echa (nie Unix), takimi jak bash, gdy opcja xpgecho nie została włączona w taki czy inny sposób, jak w czasie kompilacji lub w środowisku). printf. z drugiej strony jest bardziej niezawodny, przynajmniej wtedy, gdy ogranicza się do podstawowego użycia echa. Wypisze zawartość var, a następnie znak nowego wiersza, niezależnie od tego, jaki znak może zawierać. Wyśle ją bez znaku nowej linii. Istnieją również różnice między implementacjami printf. Posiada rdzeń funkcji określonych przez POSIX, ale istnieje wiele rozszerzeń. Na przykład niektóre obsługują q do cytowania argumentów, ale jak to zrobić różni się od powłoki do powłoki, niektóre uxxxx wsparcia dla znaków Unicode. Zachowanie różni się w przypadku drukowania 10sn var w wielobajtowych lokalizacjach, co najmniej trzy różne wyniki printf b 123 Ale w końcu, jeśli trzymasz się zestawu funkcji POSIX printf i nie próbuj niczego zbyt fantazyjnego, to ty z dala od kłopotów. Ale pamiętaj, że pierwszym argumentem jest format, więc nie powinno zawierać zmiennych kontrolowanych danych. Bardziej niezawodne echo można zaimplementować za pomocą printf. Podobnie jak w przypadku subskrybowania powłoki (co sugeruje powstanie dodatkowego procesu w większości implementacji powłoki) można uniknąć przy użyciu lokalnego protokołu IFS z wieloma powłokami lub pisać jak: 1. jak można zmienić zachowanie echa bash s. Z bash. w czasie wykonywania istnieją dwie rzeczy, które kontrolują zachowanie lub echo (opcja enable - n echo lub redefiniowanie echa jako funkcji lub aliasu): opcja bash xpgecho i czy bash jest w trybie posix. tryb posix może być włączony, jeśli bash jest nazywany jako sh lub jeśli POSIXLYCORRECT znajduje się w środowisku lub z opcją posix: Domyślne zachowanie większości systemów: xpgecho rozszerza sekwencje tak, jak wymaga tego system Unix: nadal honoruje - n i - e (i - E ): W trybie xpgecho i POSIX: tym razem bash jest zarówno POSIX, jak i Unix. Należy zauważyć, że w trybie POSIX bash nie jest zgodny z POSIX, ponieważ nie jest wysyłany - e: Wartości domyślne dla xpgecho i posix można zdefiniować w czasie kompilacji przy użyciu domyślnego --enable-xpg-echo-i - enable-strict - posix-domyślne opcje konfiguracyjne. Zwykle to, co robią ostatnie wersje OSX, aby zbudować swój bin. Żadna implementacja dystrybucji UnixLinux w swoim zdrowym umyśle zazwyczaj nie będzie tak dla binbasha. 2. Jak można zmienić zachowanie echa ksh93. W ksh93. czy echo rozszerza sekwencje escape czy nie i rozpoznaje opcje zależy od zawartości PATH. Jeśli PATH zawiera komponent zawierający 5bin lub xpg przed bin lub komponentem usrbin, zachowuje się w sposób SysVUnix (rozwija sekwencje, nie akceptuje opcji). Jeśli znajdzie ucb lub bsd pierwszy, to zachowuje się BSD 3 sposób (-e, aby włączyć rozwinięcie, rozpoznaje - n). Domyślna jest zależna od systemu, BSD na Debianie: 3. BSD dla echo - e Odwołanie się do BSD do obsługi opcji - e jest tutaj mylące. Wszystkie te różne i niekompatybilne zachowania echa zostały wprowadzone w laboratoriach Bella: n. 0ooo w Programming Work Bench UNIX (na podstawie Unix V6), a reszta (b. C.) W systemie Unix III Ref. - n w Uniksie V7 (przez Denis Ritchie Ref) - e w Uniksie V8 (przez Denis Ritchie Ref) BSD właśnie wywodziły się z Uniksa V7. FreeBSD echo nadal nie obsługuje - e. choć obsługuje - nie jak Unix V7. Jedną z zalet, jeśli chcesz to nazwać, byłoby to, że nie musisz mówić jej jak echo interpretować pewne sekwencje escape, takie jak n. Zna je zinterpretować i nie potrzebuj e-do tego. (Uwaga: konieczne jest ostatnie n, sugeruje echo, chyba że podasz opcję - n) Zauważ ostatnią nw printf. Pod koniec dnia jest to kwestia gustu i wymaga tego, czego używasz: echo lub printf. Jedną wadą printf jest wydajność, ponieważ wbudowane echo powłoki jest znacznie szybsze. Jest to szczególnie ważne w Cygwin, gdzie każde wystąpienie nowego polecenia powoduje znaczne obciążenie systemu Windows. Kiedy zmieniłem mój echo-ciężki program z użyciem binecho do muszli echo wydajność niemal podwoiła się. To kompromis między przenośnością a wydajnością. Nie jest to slamdunk dunk zawsze używać printf. Odpowiedź: 3 października 14 o 17: 00 Polecenie printfinux i Unix Polecenie FORMAT zawiera trzy typy obiektów: zwykłe. które są kopiowane dosłownie do wyjścia. interpretowane sekwencje znaków, które są znakowane ukośnikiem odwrotnym (). specyfikacje konwersji, które określają sposób, w jaki ARGUMENTY będą wyrażane jako część danych wyjściowych. Oto szybki przykład, który używa tych trzech typów obiektów: To polecenie generuje dane wyjściowe: tutaj FORMAT jest zamykany podwójnymi cudzysłowami (). Istnieje jedna specyfikacja konwersji: s. który interpretuje argument John jako ciąg i wstawia go do wyjścia. Istnieją trzy zbiegłe sekwencje znaków: dwa wystąpienia i jedno wystąpienie n. Sekwencja przekłada się na literalne podwójne cudzysłowie, która jest usuwana z ukośnikiem ułamkowym, tak aby printf traktował go jako literał, a nie jako koniec łańcucha FORMAT. n jest sekwencją znaku nowej linii i mówi printf, aby rozpoczął nową linię i kontynuował produkcję. Moc printf polega na tym, że dla dowolnego ciągu FORMAT można zmienić ARGUMENT s, aby wpływać na wyjście. Na przykład wyjście polecenia w powyższym przykładzie może zostać zmienione po prostu przez zmianę argumentu, John. Jeśli jest używany w skrypcie. ten argument można ustawić na zmienną. Na przykład polecenie wstawi wartość zmiennej środowiskowej LOGNAME. która jest nazwą użytkownika, kto wykonał polecenie. Specyfikacje konwersji Każda specyfikacja konwersji zaczyna się od a i kończy się znakiem konwersji. Pomiędzy charakterem i konwersją może być, w kolejności: Znak minus. Powiada printf, aby w lewo dostosować konwersję argumentu. Liczba całkowita, która określa szerokość pola printf, wydrukuje konwersję ARGUMENT w polu co najmniej o długości liczb znaków. W razie potrzeby będzie wyściełany po lewej stronie (lub w prawo, jeśli wymagana jest regulacja w lewo) w celu uzupełnienia szerokości pola. Okres, który oddziela szerokość pola od precyzji. Liczba całkowita, dokładność, która określa maksymalną liczbę znaków do wydrukowania z ciągu znaków lub liczbę cyfr po przecinku dziesiętnym wartości zmiennoprzecinkowej lub minimalną liczbę cyfr dla liczby całkowitej. Te rozróżniają odpowiednio krótką i długą liczbę całkowitą i są generalnie potrzebne tylko do programowania komputerowego. Znaki konwersji, które wskazują printf, jakiego rodzaju argumentu można się spodziewać, są następujące: Należy pamiętać, że printf wymaga liczby ciągów konwersji, aby dopasować liczbę ARGUMENTÓW, które mapuje je jeden do jednego, i spodziewa się znaleźć dokładnie jeden ARGUMENT dla każdego konwersji. Jedynym wyjątkiem jest ciąg konwersji, który używa gwiazdki, takie ciągi wymagają dwóch argumentów. Ciągi konwersji są zawsze interpretowane od lewej do prawej. Na przykład następujące polecenie printf: generuje następujące wyjście: Interpreted Escaped Character Sequences Następujące sekwencje znaków są interpretowane jako znaki specjalne przez printf: drukuje podwójny cudzysłów () wypisuje ukośnik odwrotny () wyświetla ostrzeżenie (odtwarza dzwonek) backspace instruuje printf, aby nie tworzył dalszych wydruków, znak escape (kod ASCII 27) drukuje kartę poziomą drukuje kartę pionową wypisuje bajt z wartością ósemkową NNN (od 1 do 3 cyfr) drukuje bajt z wartością heksadecymalną HH (1 do 2 cyfry) drukuje znak Unicode z wartością szesnastkową HHHH (4 cyfry) drukuje znak Unicode z wartością szesnastkową HHHHHHHH (8 cyfr) drukuje ARGUMENT jako ciąg znaków z uciekami interpretowanymi w powyższej tabeli, z tym że ósemkowe ucieczki mają postać 0 lub 0 NN Quoting In The Shell Uważaj na sposób, w jaki twoja skorupa interpretuje cytowane ciągi. Jeśli Twoja powłoka nie interpretuje poprawnie cytowanego ciągu, spróbuj użyć pojedynczych cudzysłowów, a nie podwójnych cudzysłowów. printf examples Drukuje następujące wyjście: Drukuje ten sam wydruk, co powyższy przykład. Drukuje ciąg informujący o położeniu katalogu domowego. Powiązane komendy awk mdash Tłumacz dla języka programowania przetwarzania AWK. bc mdash Kalkulator. echo mdash Tekst wyjściowy.

Comments