cygwin bashのエイリアスが正しい順序で実行されていないようです。

cygwin bashのエイリアスが正しい順序で実行されていないようです。

現在のMercurial管理ディレクトリに未解決の変更があることを確認するためにCygwinシェルで使用するエイリアスを作成しようとしています。 "hg st -m"コマンドは、変更されたすべてのファイルを一覧表示します。残念ながら、変更の有無によって終了値を設定しません。そこで、出力をキャプチャして空でないことを確認し、"wc -l"を介してパイピングして-gt 0であることを確認してみました。実行ではそうすることを期待します。

これが私が要約したものです:

alias hgfoo='
pwd
echo L1
localChanges="NOT SET YET"
hasLocal="NOT SET YET"
echo "Before: A${localChanges}Z A${hasLocal}Z"
localChanges=`hg st -m`
echo L2
echo "localChanges: A${localChanges}Z"
echo L3
if [ -n "${localChanges}" ] ; then
    echo L3
    hasLocal="YES"
else
    echo L4
    hasLocal="NO"
fi
echo L5
echo "RESULTS: A${hasLocal}Z"
echo L6
'

デバッグのために「Ln」エコーステートメントを入れました。変更が発生したディレクトリに「hgfoo」と入力して実行すると、次の出力が表示されます。

/d/hg/succession > hgfoo
/d/hg/succession
L1
Before: ANOT SET YETZ ANOT SET YETZ
L2
localChanges: AL2
localChanges: ANOT SET YETZ
L3
L3
L5
RESULTS: AYESZ
L6
M succession-lib\.actionScriptProperties
M succession-lib\src\main\flex\com\workscape\SuccessionConstants.as
M succession-lib\src\main\flex\com\workscape\succession\nomination\tabmodules\BenchStrengthTab.mxml
M succession-lib\src\main\flex\com\workscape\succession\nomination\tabmodules\BenchStrengthTabMediator.as
M succession-lib\src\main\flex\com\workscape\succession\puremvc\controller\StartupSuccession.asZ
L3
L3
L5
RESULTS: AYESZ
L6

変更せずにディレクトリで実行すると、次のようになります。

/d/hg/employee-profile > hgfoo
/d/hg/employee-profile
L1
Before: ANOT SET YETZ ANOT SET YETZ
L2
localChanges: AL2
localChanges: ANOT SET YETZ
L3
L3
L5
RESULTS: AYESZ
L6Z
L3
L3
L5
RESULTS: AYESZ
L6

比較がうまく機能しないという事実を忘れても、どちらの場合も間違った場所で何度も行を実行するようです。これが私を狂わせます。

どんな手がかりがありますか?ありがとうございます。

ベストアンサー1

これはbashエイリアス拡張の古いバグです。 bash 3.2.29(1) を搭載した Debian lenny amd64、4.1.5(1) を搭載した Debian squeeze i386、bash 4.1.9(3) を搭載した Cygwin 1.7.7-1 で Windows XP を実行できます。

いくつかの実験では、バグはエイリアスの使用方法の変更に非常に敏感であることが示されています。hgfooまたはhgfoo :エラーが表示されますが、正常に{ hgfoo :; }動作します(hgfoo)。エイリアスの代わりに関数を使用することも可能です。

私はそれを調査し、より小さな例を抽出しようとしました。奇妙なことは、エイリアスの改行文字に由来するようです。これはbash(3.2.29または4.1.9)の誤動作の簡単な例です。このエイリアスは、Debian lennyのpdksh、ksh93、ash、およびzshで期待どおりに機能します(Single Unix v3について読む)。つまり、oopsprints foo bar

$ alias oops='a=$(echo bar)
> echo foo $a'
$ oops
foo foo echo bar

このエラーは、以下に関連する可能性があります。「奇妙な遅延エイリアス」関連のバグが報告されました。しかし、議論の焦点は行連続(バックスラッシュ改行)であり、ここでは使用されません。


ぜひ機能を活用してみてください!エイリアスは1行のコードで機能し、コマンドにいくつかのデフォルトオプションを指定するだけです。関数には引数を渡すことができるという利点がありますhg

hgfoo () {
  localChanges=$(hg st -m "$@")
}

1私は 最初にこれがCygwinのバグだと思いました。AK2このエラーはLinuxでも発生することを指摘してください。

おすすめ記事