[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Нужен ли bash



On Mon, Sep 29, 2008 at 07:03:32PM +0300, Dmitry Nezhevenko wrote:
> > Как раз в общем случае --- да, а Вы привели случай частный.
> 
> У каждого свое понятие общего и частного случаев.

Да ничего подобного. Общий случай как раз указан в документация на make
и я его уже цитировал:

"Command execution shall be as if the makefile command line were the
argument to the system() function."

Поэтому Ваш случай --- это лишь один из возможных вариантов.

> make -- штука достаточно универсальная. Им можно собирать софт из
> исходников, LaTeX документы, ну и др. Им же можно и шелл запускать
> (явно или неявно).

Кто с этим спорит?

> Вот тебе другой пример (который как раз выполнят то, для чего был
> придуман make):
....
> make тут запускает компилятор и линкер. И шелл ему тут нафиг не нужен.

С этим никто не спорит. В некоторых случаях некоторые реализации make
сумеют обойтись без шелла.

> > Да, согласен, в этом случае make разберётся и выполнит команду напрямую,
> > однако если записать так:
> > 
> > all:
> > 	sleep 60; sleep 60
> 
> Cлив защитан (c). Можно было и явно тут /bin/sh вызвать. Впрочем
> ладна.. Я тоже буду передергивать =)

Никакого передёргивания нет и в помине. Явного указания на вызов шелла
не было. Тем не менее, какой святой дух подсказал make'у, что это
следует сделать? Он принял это решение, проанализировав СИНТАКСИС
команды. Самостоятельно. Более того, в документации описано, как он это
делает:

Some implementations do not use system() for all command lines, as
required by the portable makefile format; as a performance enhancement,
they select lines without shell metacharacters for direct execution by
execve(). There is no requirement that system() be used specifically,
but merely that the same results be achieved. The metacharacters
typically used to bypass the direct execve() execution have been any of:
  =  |  ^  (  )  ;  &  <  >  *  ?  [  ] :  $  ‘  ’  "  \  \n

К чему ещё относится это сакральное знание, как не к POSIX-шеллу?
Более того, make, вообще-то, довольно много знает про шелл. Если
написать такой makefile:

all:
	test -f /etc/passwd

то он исполнит его шеллом, а не станет вызывать /usr/bin/test.

> import os
> os.system('sleep 30; sleep 30')
> 
> Бидону придется вызывать шелл (и он его таки вызывает). А это значит,
> что синтаксис бидона непосредственно связан с синтаксисом POSIX-шелла.

Здесь нет синтаксического анализа исполняемой команды. Если написать

  os.system('sleep 30')

то шелл всё равно будет вызван.

> /* Дальше бред поскипан */

Вы собирались что-то ещё написать, но передумали?



-- 
Andrey V. Kiselev
ICQ# 26871517


Reply to: