Estou finalmente começando a me familiarizar com o shell depois de todos esses anos. Estava explorando a página do manual de bash
e olhando para a opção -D
, que, de acordo com o manual:
-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.
No entanto, no meu mac ele não gera saída e me despeja em um novo shell que parece ter menos funcionalidade do que o shell original; o which
parou de funcionar neste novo shell.
Apenas me perguntando se alguém pode oferecer uma visão sobre o que esta opção serve no mac. Provavelmente estou usando errado, tenho certeza.
Resposta
No meu mac,
bash -D
não gera saída
bash -D
(e sua opção longa equivalente --dump-strings
) lê comandos da entrada padrão ou de um arquivo e extrai strings marcado como traduzível , ou seja, strings com aspas duplas precedidas por um cifrão, como $"Hello, world"
.
Se bash -D
for executado sem nenhuma entrada, como você fez, ele não produzirá nada e iniciará um novo shell (um shell especial , veja abaixo.)
Por exemplo, para este script simples /tmp/script
:
#!/bin/bash echo $"Hello, world"
bash -D
saídas:
"Hello, world"
Como você pode ver, isso é equivalente a pesquisar linhas que correspondam a $"<text>"
e remover o cifrão.
Mais interessante é a saída da opção semelhante --dump-po-strings
, que é, como a página do manual do Bash coloca, 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 ""
Este excelente artigo Como adicionar suporte à localização para seus scripts bash fornece mais informações sobre como usar esta opção.
bash -D
me despeja em um novo shell que parece têm menos funcionalidade do que o shell original
Isso mesmo, o novo shell não reage a nenhum comando. A razão para isso é que a opção -D
implica -n
, que direciona o shell para ler comandos, mas não os executa .
O merece uma explicação: embora seja uma opção aparentemente inútil à primeira vista, é na verdade bastante útil. bash -n
não só lê comandos, mas também os valida e reclama se a sintaxe não for válida, então você pode executar bash -n <script name>
para verificar um script para erros de sintaxe sem executar nenhum comando.
Isso significa que após a execução de bash -D
, o shell que você obtém aceitará seus comandos, verifique a validade da sintaxe (e a saída um erro se necessário) e não faça nada. É por isso que which
“não” funciona “.
Veja Invocando o Bash e As seções Set Builtin do Manual de referência do Bash para obter algumas informações básicas sobre esse comportamento.
Comentários
- Muito informativo. Obrigado.
- Acabei aqui enquanto tentava entender um arquivo .sh com esta primeira linha:
#!/bin/bash -D
O-D
a opção parece ser ignorada neste contexto. Alguém pode comentar se esse uso é realmente garantido ou não? - @iwolf Interessante, só consigo pensar nisso como uma maneira rápida de " desativar " um script sem alterar os bits executáveis (ou seja, o script ainda teria o modo 755 / rwxr-xr-x mas não faz nada). Caso contrário, não ' não vejo como isso poderia ser útil. Em meus testes, esse script não faz nada (exceto imprimir strings localizáveis, ou seja, strings entre aspas duplas precedidas por um cifrão).
Resposta
O objetivo é extrair todas as strings localizáveis sem executar o script, mas não é muito útil mesmo para esse propósito limitado e acredito que está obsoleto há muito tempo. Se você quiser que ele faça algo:
% printf "foo\n\$\"bar\"\n" | bash -D "bar"
Comentários
- Citação para desaprovação? Eu não ' não acho que esteja obsoleto.