Polecenie “ bash -D ” nie ' nie wydaje się robić nic pożytecznego

Po tych wszystkich latach w końcu zaczynam lepiej zaznajomić się z powłoką. Przeglądałem stronę manuala dla bash i patrząc na opcję -D, która zgodnie z instrukcją:

  -D A list of all double-quoted strings preceded by $ is printed on the standard output. These are the strings that are sub- ject to language translation when the current locale is not C or POSIX. This implies the -n option; no commands will be executed.  

Jednak na moim Macu nie generuje danych wyjściowych i zrzuca mnie do nowej powłoki, która wydaje się mieć mniej funkcji niż oryginalna powłoka; which przestało działać w nowej powłoce.

Zastanawiam się tylko, czy ktoś może zaoferować wgląd w to, do czego służy ta opcja na Macu. Prawdopodobnie używam jej źle, jestem pewien.

Odpowiedź

Na moim Macu bash -D nie generuje wyjścia

bash -D (i jej odpowiednik długiej opcji --dump-strings) odczytuje polecenia ze standardowego wejścia lub pliku i wyodrębnia ciągi oznaczone jako możliwe do przetłumaczenia , czyli ciągi w cudzysłowie poprzedzone znakiem dolara, np. $"Hello, world".

Jeśli bash -D zostanie uruchomiony bez żadnych danych wejściowych, tak jak zrobiłeś, nic nie wyświetla i uruchamia nową powłokę ( specjalna powłoka, patrz poniżej.)

Na przykład dla tego prostego skryptu /tmp/script:

#!/bin/bash echo $"Hello, world" 

bash -D wyjścia:

"Hello, world" 

Jak widzisz, jest to równoważne wyszukaniu wierszy pasujących do $"<text>" i usunięciu znaku dolara.

Bardziej interesujące jest wyjście podobnej opcji --dump-po-strings, która jest, jak podaje strona podręcznika Bash, equivalent to -D, but the output is in the GNU gettext po (portable object) file format.:

bash --dump-po-strings /tmp/script #: /tmp/script:2 msgid "Hello, world" msgstr "" 

Ten doskonały artykuł Jak dodać obsługę lokalizacji do skryptów bash zawiera więcej informacji na temat korzystania z tej opcji.

bash -D wrzuca mnie do nowej powłoki, która wydaje się mają mniej funkcji niż oryginalna powłoka

Zgadza się, nowa powłoka nie reaguje na żadne polecenia. Powodem tego jest to, że opcja -D implikuje -n , co kieruje powłokę , aby odczytywała polecenia, ale ich nie wykonywała .

-n zasługuje na wyjaśnienie: chociaż na pierwszy rzut oka wydaje się bezużyteczna, w rzeczywistości jest całkiem przydatna. bash -n nie tylko czyta polecenia, ale także je zatwierdza i narzeka, jeśli składnia jest nieprawidłowa, więc możesz uruchomić bash -n <script name>, aby sprawdzić skrypt dla błędów składniowych bez wykonywania żadnego polecenia.

Oznacza to, że po wykonaniu bash -D, otrzymana powłoka z radością przyjmie twoje polecenia, sprawdzi poprawność składni (i wyjście błąd, jeśli to konieczne) i nie rób nic. Dlatego właśnie which „nie” nie działa „.

Zobacz Wywoływanie Bash i The Set Builtin w podręczniku Bash Reference Manual, aby uzyskać podstawowe informacje na temat tego zachowania.

Komentarze

  • Bardzo pouczające. Dzięki.
  • Skończyło się na tym, że próbowałem znaleźć sens w pliku .sh z tym pierwszym wierszem: #!/bin/bash -D The -D wydaje się być ignorowana w tym kontekście. Czy ktoś może skomentować, czy takie użycie jest kiedykolwiek uzasadnione, czy nie?
  • @iwolf Interesujące, mogę o tym myśleć tylko jako o szybkim sposobie na " wyłączenie " skrypt bez zmiany wykonywalnych bitów (to znaczy, skrypt nadal miałby tryb 755 / rwxr-xr-x, ale nic nie robił). W przeciwnym razie nie ' nie widzę, jak mogłoby się to w ogóle przydać. W moich testach taki skrypt nic nie robi (poza wypisywaniem łańcuchów możliwych do zlokalizowania, czyli ciągów w podwójnych cudzysłowach poprzedzonych znakiem dolara).

Odpowiedź

Jego celem jest wyodrębnienie wszystkich możliwych do zlokalizowania ciągów bez uruchamiania skryptu, ale nie jest to zbyt użyteczne nawet w tym ograniczonym celu i uważam, że od dawna jest przestarzałe. Jeśli chcesz zobaczyć, jak coś robi:

% printf "foo\n\$\"bar\"\n" | bash -D "bar" 

Komentarze

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *