マクロ run と cygwin の関係No.15871
freeakjp さん 03/11/25 21:08
 
WindowsXP  秀丸エディタ 4.02 and 3.19

マクロを使って、cvs edit + ファイル開き直しをしようとしたのですが、cvs コマ
ンドが /usr/local/bin/cvs になってしまい、
WinCVS の cvs コマンドになりませんでした。
(.bashrc で、alias していますが)

マクロで run (その他の run系も同様) を実行すると、cygwin でコマンドが実行さ
れてしまいます。

例:1
  run "uname -a";       // cygwin であることがわかる。

例:2
  run "cmd";            // 開いたコマンドプロンプトから、set と入力すると、c
ygwin で追加された環境変数がぞろぞろ出てきます。

ということで、cygwin で、cmd としてコマンドプロンプトを開いたのとほぼ同じ状
態で、run が実行されているようです。
[例:2] ですと、 cygwin + cmd + cmd の状態なイメージ。

cvs コマンド自体は、フルパスで WinCVS の cvs.exe を見るように、マクロをした
ので回避しましたが、
run 系の関数(?)で 「cygwin + cmd + 引数の処理実行」とならないようにはできな
いのでしょうか。

回答よろしくおねがいします。

[ ]
RE:15871 マクロ run と cygwin の関係No.15872
でるもんた さん 03/11/25 21:40
 
ユーザーのでるもんたです。

> マクロで run (その他の run系も同様) を実行すると、cygwin でコマンドが
> 実行されてしまいます。
>
> 例:1
>   run "uname -a";       // cygwin であることがわかる。
>
> 例:2
>   run "cmd";            // 開いたコマンドプロンプトから、set と入力する
> と、cygwin で追加された環境変数がぞろぞろ出てきます。
>
> ということで、cygwin で、cmd としてコマンドプロンプトを開いたのとほぼ
> 同じ状態で、run が実行されているようです。
> [例:2] ですと、 cygwin + cmd + cmd の状態なイメージ。

状況を整理させてください。

秀丸の run 系の文ではなく、スタートメニュー→ファイル名を指定して実行→
cmd.exe、と指定すれば Cygwin の bash を経由せずにコマンドプロンプトが
立ち上がるはずです。この状態では、まず、「uname -a」は Cygwin だという
表示を出すはずです。Windows XP 自体には uname というコマンドはないので、
この場合でも Cygwin が提供する uname コマンドが実行されるからです。

この状態で set と入力したらどうなりますでしょうか?
それから、この状態で環境変数 COMSPEC、SHELL、PATH はどうなっています
でしょうか? この2点で状況が整理できると思います。

ここからは憶測ですが、run 系の文を実行する前の段階で PATH が Cygwin 優先
になっているのではないかと予想します。特に、もし Cygwin の bash からコマ
ンド操作で秀丸を起動している場合は、親プロセスである bash から環境変数を
引き継ぎますので、PATH も Cygwin のものが優先になります。

[ ]
RE:15871 マクロ run と cygwin の関係No.15873
でるもんた さん 03/11/25 22:04
 
追記です。

> マクロで run (その他の run系も同様) を実行すると、cygwin でコマンドが
> 実行されてしまいます。

run "export LANG=C";

はどうなりますか?
これで何もエラーにならないようなら本当に Cygwin の bash が呼び出されています。
エラーになるようならばたぶん PATH の問題だと思います。

[ ]
RE:15871 マクロ run と cygwin の関係No.15875
L.ダヴィンチ さん 03/11/25 22:15
 

2003/11/25(火) 22:01:17

こんにちは、freeakjpさん

ダヴィンチ@ユーザーです。

/*
** タイトル:『hidesoft.2:15871| マクロ run と cygwin の関係』
** 発信日:2003年11月25日(火)
** 発信者:freeakjpさん
*/
>WindowsXP  秀丸エディタ 4.02 and 3.19
>
>マクロを使って、cvs edit + ファイル開き直しをしようとしたのですが
>、cvs コマ
>ンドが /usr/local/bin/cvs になってしまい、
>WinCVS の cvs コマンドになりませんでした。
>(.bashrc で、alias していますが)
>
>マクロで run (その他の run系も同様) を実行すると、cygwin でコマン
>ドが実行さ
>れてしまいます。

そのマクロを実行する秀丸はcygwinから実行されていませんか?
通常のWINDOWSのスタートメニューから起動した場合はどうなるでしょうか?
関係ないのかな???

>
>例:1
>  run "uname -a";       // cygwin であることがわかる。
>
>例:2
>  run "cmd";            // 開いたコマンドプロンプトから、set と入
>力すると、c
>ygwin で追加された環境変数がぞろぞろ出てきます。

上記のunameコマンドはcygwin上のコマンドなので通常WINDOWS上から
実行するとコマンドエラーになる筈です。
またはDOS環境の設定で強制的にcygwinのコマンドを優先して実行するように
されているのでしょうか?
(そんな事が出来るかどうかもわからず聞いてます。pathの設定だけの問題?)

>
>ということで、cygwin で、cmd としてコマンドプロンプトを開いたのと
>ほぼ同じ状
>態で、run が実行されているようです。
>[例:2] ですと、 cygwin + cmd + cmd の状態なイメージ。
>
>cvs コマンド自体は、フルパスで WinCVS の cvs.exe を見るように、マ
>クロをした
>ので回避しましたが、
>run 系の関数(?)で 「cygwin + cmd + 引数の処理実行」とならないよう
>にはできな
>いのでしょうか。

cvs.exeと同様にWINDOWSコマンドのフルパスで記述すれば
WINDOWSコマンドが起動されるのではないでしょうか?
(全て憶測です。)

>
>回答よろしくおねがいします。

他のマクロ実行環境を持っているソフトではどうでしょうか?
秀丸に限った事でもないように思えます。
たとえばEXCELのVBAとか?

--
メーラー: TuruKame 3.07beta18
OS: Windows98 SE
※このコメントはサイトー企画とは無関係です。
※私の個人的な見解です。

[ ]
RE:15871 マクロ run と cygwin の関係No.15886
秀まるお2 さん 03/11/26 16:35
 
 一応、サイトー企画からもコメントさせていたたきますと、サイトー企画側で
はその「cygwin」についてあまり詳しく知りません。

 他のユーザー様からのコメントを参考に解決して欲しいです。

[ ]
RE:15875 マクロ run と cygwin の関係No.15889
でるもんた さん 03/11/26 17:23
 
でるもんたです。

> 上記のunameコマンドはcygwin上のコマンドなので通常WINDOWS上から
> 実行するとコマンドエラーになる筈です。
> またはDOS環境の設定で強制的にcygwinのコマンドを優先して実行するように
> されているのでしょうか?
> (そんな事が出来るかどうかもわからず聞いてます。pathの設定だけの問題?)

uname は各種 UNIX では外部コマンドですので、Cygwin でもたぶん外部コマンド
だと思います。というわけで、つまるところ PATH の設定の問題だと思います。

>  一応、サイトー企画からもコメントさせていたたきますと、サイトー企画側で
> はその「cygwin」についてあまり詳しく知りません。

Cygwin は特に Windows の内部に手を加えるような変なことをしているわけでは
なく、
  1.UNIX 系 OS のシステムコールやコンソールの挙動を再現する DLL
  2.その DLL を呼び出す形で作られた、普通の Win32 アプリ
を組み合わせただけのものです。ですので、普通の Windows アプリから Cygwin
アプリを呼び出すことも、逆に Cygwin アプリから Windows アプリを呼び出す
ことも可能です。

同じ名前のコマンドが複数あるときの起動の優先順位は、当然、Cygwin アプリか
どうかに関わらず PATH 順です。
(SHELL32.DLL 経由だとレジストリも見ますが。)

[ ]
RE:15889 マクロ run と cygwin の関係No.15898
freeakjp さん 03/11/26 20:36
 
でるもんたさん、L.ダヴィンチさん ありがとうございます。

まとめますと、この現象がでるのは以下のようになりました。
  (1-1) cygwin から 秀丸を起動したとき。
  (1-2) (1-1)の秀丸から grep をして、そこからタグジャンプで新しい秀丸を開い
たとき。

この現象がでないのは、
  (2-1) スタートメニューなどから普通に秀丸を起動したとき。
  (2-2) cygwin から起動した秀丸で、Ctrl + N で新規秀丸を開いたとき。

> でるもんたさん
> run "export LANG=C";

 これだけですと、結果がなにも帰ってこないので、
 run "cmd" した プロンプトの中で、export としたのですが、コマンドがないと怒
られました。(lsなどは動く)
 なので、bash ではなく、他のシェルが起動しているようです。

> L.ダヴィンチさん
> cvs.exeと同様にWINDOWSコマンドのフルパスで記述すれば

これは、だめでした。 run "cmd" と同じ結果です。

よって、起動元が cygwin だった場合と、その秀丸マクロから run を実行したとき
のみ、この現象がでるようです。
なので、「cygwin から起動しない」意外に回避出来ない気がします。

※秀まるお2さんへ
  タグジャンプは、内部的に マクロ run と同じ処理してませんか?

[ ]
RE:15898 マクロ run と cygwin の関係No.15899
でるもんた さん 03/11/26 21:22
 
でるもんたです。

> まとめますと、この現象がでるのは以下のようになりました。
>   (1-1) cygwin から 秀丸を起動したとき。
>   (1-2) (1-1)の秀丸から grep をして、そこからタグジャンプで新しい秀丸を
> 開いたとき。
>
> この現象がでないのは、
>   (2-1) スタートメニューなどから普通に秀丸を起動したとき。
>   (2-2) cygwin から起動した秀丸で、Ctrl + N で新規秀丸を開いたとき。

結果が出ましたか。
結局、Cygwin がいろいろな環境変数を設定する、という問題に尽きると思います。

> > run "export LANG=C";
>
>  これだけですと、結果がなにも帰ってこないので、
...
>  なので、bash ではなく、他のシェルが起動しているようです。

シェルは何も経由せずに、秀丸が直に実行プログラムを起動しているようです。

前の投稿のあとで調べてみたのですが、手元の環境(Windows Me、Cygwin なし)
では run "dir"; もエラーになります。つまり、command.com は経由していない
という意味です。

>  run "cmd" した プロンプトの中で、export としたのですが、コマンドが
> ないと怒られました。(lsなどは動く)

これは正常な動作です。Windows XP に元々ついてきている cmd.exe ですので、
export というコマンドはありません。

> なので、「cygwin から起動しない」意外に回避出来ない気がします。

フルパスで指定すれば、cvs.exe の場合のように、PATH が違うという問題は
クリアできるはずですが…
(もちろん、秀丸マクロの "" の中では \ を \\ と書く、という初歩的な点は
おさえてくださいね。)

しかし、以前の投稿の
> run 系の関数(?)で 「cygwin + cmd + 引数の処理実行」とならないよう
> にはできないのでしょうか。
という言葉の意味が、「Cygwin が設定する環境変数が存在しない状態でコマンドを
実行する」という意味であれば、おっしゃるとおり、Cygwin から起動しないように
するしか完全な回避策はないと思います。

ただし、無駄な環境変数を消去する bash スクリプトなどを書いて、そこから
秀丸を起動するという方法はあります。

また、PATH だけが問題で他の環境変数は影響しないのであれば、~/.bash_profile
あたりで PATH を設定していて、そこが Cygwin 優先の設定になっていると思われ
ますので、そこを変更できないか検討してください。

[ ]
RE:15899 マクロ run と cygwin の関係No.15929
freeakjp さん 03/12/01 13:00
 
>また、PATH だけが問題で他の環境変数は影響しないのであれば、~/.bash_profile
>あたりで PATH を設定していて、そこが Cygwin 優先の設定になっていると思われ
>ますので、そこを変更できないか検討してください。

PATH の問題ではなく、cygwin の上に 秀丸が動いているという状態になっているの
だと思います。
フルパスで cmd を実行してもだめでしたので。

なので、よくは分かりませんが、run の実装も、Ctrl + N の時のようにならないか
ぎり、だめなんだと思います。

[ ]
RE:15929 マクロ run と cygwin の関係No.15934
アルビレオ さん 03/12/02 02:22
 
秀丸ユーザーのアルビレオです。

>PATH の問題ではなく、cygwin の上に 秀丸が動いているという状態になっているの
>だと思います。

秀丸自体がcygwinの上で動いているというわけではなく、cygwinから秀丸を起動
したので
・環境変数
・カレントディレクトリ
・起動シェルがcygwinであること
といった情報が秀丸に渡されます。
そしてrunを実行しようとすると起動シェルから実行しようとするのでcygwin上
で動作することになります。

>フルパスで cmd を実行してもだめでしたので。

cmd.exeもcygwinから起動されることになり、環境変数はcygwinから引き継がれ
ます。だからPATHの問題というのも的外れではないと思います。
cmd.exe内でPATHを書き換えればcvsコマンドの問題は解決するのではないでしょ
うか。

起動シェルがcygwinであってもrunが強制的にcommand.comやcmd.exeを起動しよ
うとする方がトラブルは多くなると思います。
runのような機能がが起動シェルの環境で実行されるのは一般的なごく当たり前
の仕様で、そのために起こるトラブルはユーザー側の責任で対処するのが正当で
しょう。
これは秀丸自身の問題ではなく環境の問題で、その環境を管理しているのはユー
ザーなのですから。

[ ]
RE:15934 マクロ run と cygwin の関係No.15944
でるもんた さん 03/12/02 19:37
 
でるもんたです。

> 秀丸自体がcygwinの上で動いているというわけではなく、cygwinから秀丸を
> 起動したので
> ・環境変数
> ・カレントディレクトリ
> ・起動シェルがcygwinであること
> といった情報が秀丸に渡されます。

ここまでは合っているのですが、

> そしてrunを実行しようとすると起動シェルから実行しようとするのでcygwin上
> で動作することになります。

これは誤りです。run 文はシェルを呼び出しません。
試しに、Cygwin なしの環境で、run "dir"; としてみてください。
動かないはずです。

あとは別投稿で。

[ ]
RE:15929 マクロ run と cygwin の関係No.15946
でるもんた さん 03/12/02 21:03
 
でるもんたです。

> >また、PATH だけが問題で他の環境変数は影響しないのであれば、~/.bash_profile
> >あたりで PATH を設定していて、そこが Cygwin 優先の設定になっていると思われ
> >ますので、そこを変更できないか検討してください。
>
> PATH の問題ではなく、cygwin の上に 秀丸が動いているという状態になっているの
> だと思います。
> フルパスで cmd を実行してもだめでしたので。

まだまだ、私の不正確な表現で混乱をきたしてしまっているようですね。

まずは状況整理から。

Cygwin の上に秀丸、という表現は不正確です。

まず、秀丸は Windows アプリなので、スタートメニューから起動しても、bash
から起動しても、Windows の kernel32.dll、gdi32.dll、user32.dll といった
DLL を経由して Windows に指示を出します。起動してしまえばあとは秀丸の動
作に Cygwin は何も関与しません。極端な話、bash から秀丸を起動し、bash
のほうを閉じると、秀丸を動かしたまま Cygwin のアンインストールすらでき
て、それでも秀丸は全く問題なく動作し続けます。

次に Cygwin ですが、これはいったん起動したら常駐し続けて Windows に影響
を与え続けるというものではありません。単に、Cygwin 用に作られたアプリが
動いている間だけ、UNIX のシステムコールをエミュレートする DLL が動作す
る、というだけのものです。Cygwin アプリは、Windows の kernel32.dll など
は原則として直接呼び出さずに、Cygwin の DLL を呼び出し、その Cygwin の
DLL が kernel32.dll などを呼び出します。

その一方で、Cygwin では、もともと UNIX 用に作られたアプリが動くためには
色々な環境変数を設定する必要があります。これは推測ですが、bash を最初に
起動する際に、どこかの初期設定ファイル(/etc/profile あたりかな?)に書
いてあるとおりに環境変数を設定するはずです。

#スタートメニューやデスクトップに bash を起動するアイコンがあったら、
#それのプロパティを見てみてください。-l(または --login)という引数が
#指定されていませんか?

                  ☆

で、スタートメニューから秀丸なり cmd.exe なりを起動した場合は、その親プ
ロセスは Explorer.exe ですから、Explorer.exe の環境変数を引き継ぎ、Cygwin
の初期設定ファイルで指定されている環境変数は設定されないまま起動します。

一方で、bash から秀丸なり cmd.exe なりを起動した場合、親プロセスは当然
bash ですから、bash のための環境変数がたくさん設定された状態で起動します。

手元に Cygwin がないので断言ができないのですが、これ以外に、両者で違いは
ないはずです。つまり、PATH を含めて色々と環境変数が設定されているか否か、
これだけです。run 文で呼び出すアプリの挙動がスタートメニューから起動した
秀丸と bash から起動したアプリとで違うとすれば、環境変数の違いのはずです。

                  ☆

で、本題。

今までの投稿では、run 文で CVS 以外に何を動かしたいのかが書かれていない
ので、なんともコメントしがたいのですが、run 文ではなく cmd.exe から動か
しても、bash から起動した cmd.exe とスタートメニューから起動した cmd.exe
とでは同じ違いが出るはずです。

具体的に
・何をしたくて(=どんなアプリを起動したくて)
・run 文にどういう引数を与えて
・どんな動作を期待していて
・実際にはどういう結果が出たのか
・(おまけ)結果がそうだと考えた根拠は何か
を順を追って書いていただければ、ほかの人もアドバイスができると思います。

                  ☆

> なので、よくは分かりませんが、run の実装も、Ctrl + N の時のようになら
> ないかぎり、だめなんだと思います。

これは、Ctrl+N の挙動のほうが特殊だと思います。常駐秀丸を使用しているの
ではないかと推測しますが(タスクバーに秀丸のアイコンが常駐していません
か?)、この場合、Ctrl+N が押されたことを検知した秀丸は、常駐秀丸に指示
を出して新しい秀丸を起動するはずです。

その常駐秀丸の親プロセスは、最初に秀丸を起動したときに bash から起動して
いれば bash、スタートメニューから起動していれば Explorer.exe で、どちらの
場合も親プロセスの環境変数を引き継ぎます。

さらに、設定の「ウィンドウ→秀丸の常駐」で「秀丸の瞬間起動」が ON になっ
ていると、秀丸を終了してもそのプロセスを殺さずに、新しい秀丸を起動しよう
としたときに再利用されるので、Cygwin の環境変数を保持した秀丸と、保持し
ていない秀丸とが混在し、いつどちらが使われるのか予想がつきません。

                  ☆

というわけで、選択肢は次のどれかです。

・各種マクロ・スクリプトなどを、Cygwin の環境変数を持っている秀丸と持って
 いない秀丸とが混在してもかまわないような設計にする
・秀丸は常に Cygwin から起動するか、常にスタートメニューから起動するか、
 どちらかにする
・コントロールパネル→システム→環境、で、Cygwin の環境変数をひととおり
 設定し、すべての Windows アプリが Cygwin の環境変数を保持するようにする

いかがでしょう。

[ ]