(Cygwin で) Bash を使用すると、次のような動作が発生します。
$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ
端末で UTF-8 または ISO-8859-1 エンコーディングを使用するかどうかは問題ではありません。
私の質問は次のとおりです。 envは正確に何をしますか? この特定のケースでなぜそれが必要なのですか?
(Cygwin で) Bash を使用すると、次のような動作が発生します。
$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ
端末で UTF-8 または ISO-8859-1 エンコーディングを使用するかどうかは問題ではありません。
私の質問は次のとおりです。 envは正確に何をしますか? この特定のケースでなぜそれが必要なのですか?
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