[Date Prev][Date Next][Thread Prev][][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 の候補があるか、などを見ていただけるとあ
りがたいです。