13

(Cygwin で) Bash を使用すると、次のような動作が発生します。

$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ

端末で UTF-8 または ISO-8859-1 エンコーディングを使用するかどうかは問題ではありません。

私の質問は次のとおりです。 envは正確に何をしますか? この特定のケースでなぜそれが必要なのですか?

4

1 に答える 1

17

envにないbash、スタンドアロンの実行可能ファイルであり、プログラムを実行する前に環境変数を設定またはクリアするために使用されます。printfあなたの特定のケースでは、シェルビルトインの代わりにバイナリを実行しています。絶対パスを使用して同じ結果を得ることができます。

/usr/bin/printf '\u00d5'

最も邪魔にならない方法は、おそらく次のとおりです。printf関数を再定義し、残りをBashに処理させます。以下を含むファイルを入手します。

function printf()
{
  $(which printf) "$@"
}

またはワンライナーとしてfunction printf() { $(which printf) "$@"; }。もちろん、あなたはのために置き換えることができ$(which printf)ます/usr/bin/printf...

次に、慣れているようにprintfを使用します。スクリプトは同じままで、特定のBashバージョンでのみ関数を定義する条件を導入することもできます。

AFAIKを省略してもかまいませんがfunction、読みやすさが向上します。

[編集:functionキーワードはbash拡張機能です。printf () { ...; }POSIX構文です。functionキーワードを使用する場合、関数名の後の()はオプションです。]


一般的に、env移植性を追求するスクリプトのハッシュバン行でも使用されます。その理由envは、ほとんどの場合、/usr/bin/envにありますが、ハッシュバンラインが示すほど多くbashはない場合があります。/bin/bash例:

#!/usr/bin/env bash

他のプログラム/通訳者にも使用できます。

#!/usr/bin/env python
于 2012-10-02T13:48:39.103 に答える