From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: pjb@informatimago.com (Pascal J. Bourguignon) Newsgroups: gmane.emacs.help Subject: Re: system-command-exists-p Date: Mon, 07 Dec 2009 14:44:00 +0100 Organization: Informatimago Message-ID: <87vdgiew67.fsf@galatea.local> References: <87bpibf5xl.fsf@galatea.local> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1260199419 18410 80.91.229.12 (7 Dec 2009 15:23:39 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 7 Dec 2009 15:23:39 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Mon Dec 07 16:23:32 2009 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NHfQy-0003N4-0G for geh-help-gnu-emacs@m.gmane.org; Mon, 07 Dec 2009 16:23:32 +0100 Original-Received: from localhost ([127.0.0.1]:41253 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NHfQx-00049U-Nh for geh-help-gnu-emacs@m.gmane.org; Mon, 07 Dec 2009 10:23:31 -0500 Original-Path: news.stanford.edu!usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 79 Original-X-Trace: individual.net jze0syR4Kq0WWqLypzhbZg6kK7EW4ulleyBG7KpEP+kHOTI8Tz Cancel-Lock: sha1:ZWZmZjM0ODE5NTFiNzM2MDE5NzU4NWY4Zjg2MWViNjk0YjEwMTViYQ== sha1:G0mTrJ6gpErnjZHroHAIon16jMI= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en X-Disabled: X-No-Archive: no User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.3 (darwin) Original-Xref: news.stanford.edu gnu.emacs.help:175397 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:70473 Archived-At: Andreas Röhler writes: > Pascal J. Bourguignon wrote: >> Andreas Roehler writes: >> >>> Hi, >>> >>> needed a check if a command exists on system. >>> Employed the following: >>> >>> (defun system-command-exists-p (command) >>> "Return t if COMMAND is available on system. " >>> (let* ((cmd (format "type %s" command))) >>> (eq 0 (shell-command cmd)))) >>> >>> Any comments/suggestions? >> >> Use %S or (shell-quote-argument command). >> >> type is a built-in command specific to the sh familly of shells. >> Perhaps it would be a good idea to explicitely call up sh? > > >> >> It may be useful to return the path of the command: >> >> (defun system-command-exists-p (command) >> "Return t if COMMAND is available on system. " >> (let* ((cmd (format "/bin/sh -c 'type %s'" >> (shell-quote-argument command)))) >> (when (eql 0 (shell-command cmd)) >> (let ((result (shell-command-to-string cmd))) >> (if (string-match "^.* is \\(.*\\)\n$"result) >> (match-string 1 result) >> result))))) >> >> (mapcar (function system-command-exists-p) >> '("cat" "type" "foo")) >> --> ("/bin/cat" "a shell builtin" nil) >> >> >> > > Thanks a lot. > > Concerning the precise kind-of-"shell"-question, I'm not sure. > Case is to write a check for pack-unpack functions. > > Presently dired-do-compress uses a hard-encoded "gzip", replaced here by > a choice so far. > > Then testing all compressing/uncompressing possibilities, it turns out some might not be installed. > > type uncompress => > uncompress is /usr/bin/uncompress > type compress => > bash: type: compress: not found > > Test should not fail, if these programms are not installed, rather give a message. > So far the issue here. > > Think the shell-in-use should not matter, resp. will be selected already. > > What about to write: > > (cmd (format (concat (getenv "SHELL") " -c 'type %s'") My point was that SHELL might be csh or tcsh which don't have a type command built-in, or even scsh or clash (clisp) who don't even use the same syntax! Or yet something else. So you can just make the assumption that SHELL is a sh-compatible shell, and go ahead, or try to run sh yourself. After all, people who use csh or tcsh just deserve what they get, and people using exotic shells are expected to know what they're doing ;-) -- __Pascal Bourguignon__