“ bash -D ” o comando não ' parece fazer nada útil

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *