[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: /bin/sh
>>>>> In [emacs-w3m : No.07915] 山岡 wrote:
> Makefile が設定している環境変数 SHELL の値が /bin/sh で、make か
> ら起動された Meadow の shell-file-name 変数に引き継がれます。そ
> れを w3mhack.el が、以下の式で置き換えているのですね。
> (when (eq system-type 'windows-nt)
> (setq shell-file-name "cmdproxy.exe"))
windows-nt な Emacs では、必ず cmdproxy.exe が存在するんですか?
加えて、OS/2 でも同様に shell-file-name 変数の値を置き換える必要
があるようなので、この式に代わるものを作ってみました。
;; Check whether the shell command can be used.
(let ((test (lambda nil
(let ((buffer (generate-new-buffer " *temp*"))
(msg "Hello World"))
(save-excursion
(set-buffer buffer)
(condition-case nil
(call-process shell-file-name
nil t nil "-c"
(concat "MESSAGE=\"" msg "\"&&"
"echo \"${MESSAGE}\""))
(error))
(prog2
(goto-char (point-min))
(search-forward msg nil t)
(kill-buffer buffer)))))))
(or (funcall test)
(progn
(require 'executable)
(setq shell-file-name (executable-find "cmdproxy"))
(funcall test))
(progn
(setq shell-file-name (executable-find "sh"))
(funcall test))
(progn
(setq shell-file-name (executable-find "bash"))
(funcall test))
(error "\
There is no shell command which is equivalent to /bin/sh. Try
``make SHELL=foo [option...]'', where `foo' is the absolute path name
for the proper shell command in your system.")))
ちなみに、手元の Meadow で試したところ、以下のようになりました。
(executable-find "cmdproxy")
=> "d:/Meadow/2.10/bin/cmdproxy.exe"
(executable-find "sh")
=> "d:/cygwin/bin/sh.exe"
(executable-find "bash")
=> "d:/cygwin/bin/bash.exe"
上記の式で行なっている bourne shell かどうかのテストが適切かどう
か、他にも使える shell の候補があるか、などを見ていただけるとあ
りがたいです。