nastaveni bashe jako defautlt shell

Dan Lukes dan at obluda.cz
Sat Dec 15 14:52:08 CET 2007


Daniel Gerzo napsal/wrote, On 12/15/07 12:01:
>>> #! /usr/local/bin/bash. Toto som riesil hrubou silou:

>> Lze ve skriptu definovat shell bez zavislosti na jeho umisteni v OS?

> napr. #!/usr/bin/env bash

	No, to je sice zdanlive jasna odpoved na jasnou otazku, ale obavam se, 
ze ses nezabyval smyslem puvodni otazky. A navic je to odpoved kruhem.

	Zavislost scriptu na pevnem umisteni jsi nahradil zavislosti na pevnem 
umisteni 'env'.

	Jestli predpokladas, ze na FreeBSD je vzdy env v /usr/bin pak to uz 
muzeme rovnou predpokladat, ze bash (pokud je vubec pritomen) je v 
/usr/local/bin

	Ja ale preedpokladam, v pozadi otazky byl pozadavek na portabilnost 
scriptu mezi ruznymi OS (protoze v ramci FreeBSDS je tam opravdu 
jednodussi napsat proste /usr/local/bin/bash).

	A pro jine OS tohle reseni reseni neni - jednak neni jiste, jestli tam 
'env' vubec bude, a kdyz uz ano, zda bude delat to co predpokladas, a 
kdyz uz ano, zda bude prave v /usr/bin

	Obavam se, ze na puvodni otazku neexistuje obecna odpoved - zalezi an 
tom jak je to v systemu implementovano - zda bude nebo nebude 
prohledavat PATH

	Castecnou odpoved ma POSIX - jen ten predpoklada, ze spustitelne 
programy se do systemu nekopiruji - ze se to nej instaluji. Pak uz to je 
jednoduche:

  --------------
Furthermore, on systems that support executable scripts (the "#!" 
construct), it is recommended that applications using executable scripts 
install them using getconf -v to determine the shell pathname and update 
the "#!" script appropriately as it is being installed (for example, 
with sed). For example:

#
# Installation time script to install correct POSIX shell pathname
#
# Get list of paths to check
#
Sifs=$IFS
IFS=:
set $(getconf PATH)
IFS=$Sifs
#
# Check each path for 'sh'
#
for i in $@
do
     if [ -f ${i}/sh ];
     then
         Pshell=${i}/sh
     fi
done
#
# This is the list of scripts to update. They should be of the
# form '${name}.source' and will be transformed to '${name}'.
# Each script should begin:
#
# !INSTALLSHELLPATH -p
#
scripts="a b c"
#
# Transform each script
#
for i in ${scripts}
do
     sed -e "s|INSTALLSHELLPATH|${Pshell}|" < ${i}.source > ${i}
done
  --------------

						Dan



-- 
Dan Lukes                                               SISAL MFF UK
AKA: dan at obluda.cz, dan at freebsd.cz, dan at (kolej.)mff.cuni.cz



More information about the Users-l mailing list