“ bash -D ”コマンドは'何も役に立たないようです

ここ数年でようやくシェルに慣れてきました。bashをクリックし、-Dオプションを確認します。これは、マニュアルによると:

  -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.  

ただし、私のMacでは出力が生成されず、元のシェルよりも機能が少ないと思われる新しいシェルにダンプされます。whichコマンドはこの新しいシェルで機能しなくなりました。

誰かがこのオプションがMacで何のためにあるのかについての洞察を提供できるかどうか疑問に思っています。私はおそらくそれを間違って使用している、と確信しています。

回答

私のMacでは、bash -Dは出力を生成しません

bash -D(および同等の長いオプション--dump-strings)は、標準入力またはファイルからコマンドを読み取り、文字列を抽出します翻訳可能としてマーク、つまり、$"Hello, world"のようにドル記号が前に付いた二重引用符で囲まれた文字列。

bash -Dを入力なしで実行すると、何も出力されず、新しいシェルが開始されます特別なシェル。以下を参照してください。)

たとえば、この単純なスクリプトの場合/tmp/script

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

bash -D出力:

"Hello, world" 

ご覧のとおり、これは$"<text>"に一致する行を検索してドル記号を削除することと同じです。

さらに興味深いのは、同様のオプション--dump-po-stringsの出力です。これは、Bashのmanページにあるように、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 "" 

この優れた記事 bashスクリプトにローカリゼーションサポートを追加する方法このオプションの使用方法の詳細を提供します。

bash -Dは、私を新しいシェルにダンプします。元のシェルよりも機能が少ない

そうです、新しいシェルはどのコマンドにも反応しません。これは、 -Dオプションが-n を意味するためです。これは、シェルにコマンドを読み取るように指示しますが、コマンドは実行しません

-nオプションは説明に値します。一見役に立たないように見えますが、実際には非常に便利です。 bash -nはコマンドを読み取るだけでなく、コマンドを検証し、構文が無効な場合は文句を言うので、bash -n <script name>を実行してスクリプトを確認できます。コマンドを実行せずに構文エラーが発生した場合。

これは、bash -Dを実行した後、取得したシェルがコマンドを受け入れ、構文の有効性(および出力)を確認することを意味します。必要に応じてエラー)、何もしません。そのため、whichは「機能しません」。

「Bashの呼び出し」を参照してください。この動作の背景情報については、Bashリファレンスマニュアルの Set Builtin セクションを参照してください。

コメント

  • 非常に有益です。ありがとう。
  • この最初の行で.shファイルを理解しようとしたときに、ここに行き着きました:#!/bin/bash -D -Dオプションはこのコンテキストでは無視されるようです。この使用法が実際に正当化されるかどうかについて誰かがコメントできますか?
  • @iwolf興味深いことに、"を無効にする簡単な方法としか考えられません"実行可能ビットを変更しないスクリプト(つまり、スクリプトのモードは755 / rwxr-xr-xのままですが、何もしません)。そうでなければ、'これがどのように役立つかわかりません。私のテストでは、このようなスクリプトは何もしません(ローカライズ可能な文字列、つまりドル記号が前に付いた二重引用符で囲まれた文字列を出力する場合を除きます)。

回答

スクリプトを実行せずにすべてのローカライズ可能な文字列を抽出することを目的としていますが、その限られた目的でもあまり有用ではなく、長い間非推奨になっていると思います。何かを実行していることを確認したい場合:

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

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です