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
- Cytat o wycofaniu? Nie ' nie sądzę, że jest przestarzały.