2011-07-13

Peklo s dash

Tak jsem se konečně rozhodl, začít migrovat s Debian Lenny na Debian Sqeeze.
Tak trochu jsem k tomu byl přinucen.

Některé věci mne nepřestávají udivovat.  Konkrétně začínám být velmi ale velmi předpojatý k programu dash.  Po tom co jsem si zažil se mi začíná dělat zle už když slyším ten název.

V čem je problém? v DashAsBinSh

Prostě v Sqeeze je /bin/sh odkazem na /bin/dash.
Jenže některé programy, "zcela nečekaně" při své práci volají /bin/sh.  Já mám třeba nějaké Makefile, které jsem sestavoval už před dlouho dobou a jsem s nimi spokojen.  Tedy byl jsem až do pokusu spustit make na Debian Sqeeze.  najednou nic nefungovalo.  Ještě že mě napadlo, udělat takový malý příklad a odtrasovat si ho strace.  Toto je obsah Makefile:


do-copy:
-cp book.{ps,pdf} dir/
-echo $$BASH_VERSION


na Lenny funguje pěkně

radek@vanor:~/work/make-problem$ strace -o lenny make do-copy


cp file dir/
cp book.{ps,pdf} dir/
echo $BASH_VERSION
3.2.39(1)-release


Ale na Sqeeze jsem se se zlou potázal

radek@ulys:/vol/HOME/radek/work/make-problem$ strace -f -o sqeeze2 make do-copy
cp book.{ps,pdf} dir/
cp: nelze získat informace o „book.{ps,pdf}“: Adresář nebo soubor neexistuje
make: [do-copy] Error 1 (ignored)
echo $BASH_VERSION

prázdný řádek tam kde má být verze bashe mi napověděl, ale strace potvrdil.

2586  execve("/bin/sh", ["/bin/sh", "-c", "echo $BASH_VERSION"], [/* 40 vars */]) = 0



# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 13. čec 22.04 /bin/sh -> dash


Při spatření posloupnosti písmen "dash" mi začaly zvonit všechny výstražné zvonky v hlavě.  Toto už jsem někde zahlédl a ne zrovna v pěkné souvislosti.


Najít pomocí Google  DashAsBinSh pak bylo snadné.  A nastavit /bin/sh na něco použitelného (t.j. bash) pak jendoduché

# dpkg-reconfigure dash

a odpovědět ne, opravdu nechci dash jako shell.  Ve skutečnosti bych s s dash nejradši už nikdy v životě nepotkal.

DODATEK:
Ano, hned po té, co jsem tento příspěvek publikoval, mne napadlo prozkoumat dokumentaci make.  Nalezl jsem další řešení.  Pokud je v Makefile nastavena proměnná SHELL, použije se.  Bohužel nestačí mít proměnnou SHELL v prostředí, musí být nastavena v Makefile.

V každé případě považuji změnu /bin/sh na /bin/bash za vhodnější, protože kdo ví, co všechno jiného by se ještě "rozsypalo".

Žádné komentáře: