From: Stephen W. <sw...@ul...> - 2004-10-25 13:29:51
|
>>> Peter Prohaska <pi...@wg...> 25/Oct/2004 07:04:58 >>> >With a little adaption, the thing should now work for bash as well. >If someone knows how to avoid the tempfile, please enlighten me. Ok, replace echo "builtin hash -p $app $(basename $(dirname $app))" >> $T with eval builtin hash -p $app $(basename $(dirname $app)) |
From: Stephen W. <sw...@ul...> - 2004-10-26 12:24:33
|
>>> Peter Prohaska <pi...@wg...> 26/Oct/2004 12:48:16 >>> >On Mon, Oct 25, 2004 at 02:26:51PM +0100, Stephen Watson wrote: >> >>> Peter Prohaska <pi...@wg...> 25/Oct/2004 07:04:58 >>> >> >With a little adaption, the thing should now work for bash as well. >> >If someone knows how to avoid the tempfile, please enlighten me. >> >> Ok, replace >> echo "builtin hash -p $app $(basename $(dirname $app))" >> $T >> with >> eval builtin hash -p $app $(basename $(dirname $app)) > >Does not work for me and i don't see what the eval would change. >It seems to me that it's the find while construct leads to execution of >hash in some different context. Well my version doesn't use find: if [ "x$BASH" = x ] ; then exit 1 fi if [ x"$APPDIRPATH" = x ]; then APPDIRPATH="$HOME/Apps:/usr/local/apps:/usr/apps" export APPDIRPATH fi # Reverse the path because otherwise later apps override path= IFS=: for dir in $APPDIRPATH ; do if [ "x$path" = "" ] ; then path="$dir" else path="${dir}:$path" fi done echo $path IFS=: for dir in $path ; do for app in "$dir"/*/AppRun ; do if [ -x "$app" ] ; then eval builtin hash -p "$app" $(basename $(dirname "$app")) fi done done Probably needs a few more things quoting to protect against spaces. |
From: Ken H. <ke...@ha...> - 2004-10-26 14:19:09
|
Stephen Watson wrote: >>>> Peter Prohaska <pi...@wg...> 26/Oct/2004 12:48:16 >>> >> >> On Mon, Oct 25, 2004 at 02:26:51PM +0100, Stephen Watson wrote: >> >>>>>> Peter Prohaska <pi...@wg...> 25/Oct/2004 07:04:58 >>> >>>> >>>> With a little adaption, the thing should now work for bash as well. >>>> If someone knows how to avoid the tempfile, please enlighten >>>> me. >>> >>> Ok, replace echo "builtin hash -p $app $(basename $(dirname >>> $app))" >> $T with eval builtin hash -p $app $(basename $(dirname >>> $app)) >> >> Does not work for me and i don't see what the eval would change. It >> seems to me that it's the find while construct leads to execution of >> hash in some different context. > > > Well my version doesn't use find: > > if [ "x$BASH" = x ] ; then exit 1 fi > > if [ x"$APPDIRPATH" = x ]; then > APPDIRPATH="$HOME/Apps:/usr/local/apps:/usr/apps" export APPDIRPATH > fi > > # Reverse the path because otherwise later apps override path= IFS=: > for dir in $APPDIRPATH ; do if [ "x$path" = "" ] ; then path="$dir" > else path="${dir}:$path" fi done echo $path > > IFS=: for dir in $path ; do for app in "$dir"/*/AppRun ; do if [ -x > "$app" ] ; then eval builtin hash -p "$app" $(basename $(dirname > "$app")) fi done done > > Probably needs a few more things quoting to protect against spaces. The 'find' version catches subdirs (e.g ~/Apps/Utilities). It appears yours doesn't (but it could if you make a recursive function call). Yours would then have the benefit (?) of not relying on any external resource. |
From: Jonatan L. <th...@ho...> - 2004-10-26 23:19:08
|
On Tue, 26 Oct 2004 07:26:49 -0700 Ken Hayber <ke...@ha...> wrote: > >>> Ok, replace echo "builtin hash -p $app $(basename $(dirname > >>> $app))" >> $T with eval builtin hash -p $app $(basename $(dirname > >>> $app)) > >> > >> Does not work for me and i don't see what the eval would change. > >It> seems to me that it's the find while construct leads to > >execution of> hash in some different context. > > > > > > Well my version doesn't use find: > > > > if [ "x$BASH" = x ] ; then exit 1 fi > > > > if [ x"$APPDIRPATH" = x ]; then > > APPDIRPATH="$HOME/Apps:/usr/local/apps:/usr/apps" export APPDIRPATH > > > > fi > > > > # Reverse the path because otherwise later apps override path= > > # IFS=: > > for dir in $APPDIRPATH ; do if [ "x$path" = "" ] ; then path="$dir" > > > > else path="${dir}:$path" fi done echo $path > > > > IFS=: for dir in $path ; do for app in "$dir"/*/AppRun ; do if [ -x > > "$app" ] ; then eval builtin hash -p "$app" $(basename $(dirname > > "$app")) fi done done > > > > Probably needs a few more things quoting to protect against spaces. > > The 'find' version catches subdirs (e.g ~/Apps/Utilities). It > appears yours doesn't (but it could if you make a recursive function > call). Yours would then have the benefit (?) of not relying on any > external resource. That's the nice thing with find, at least for me who has /ROX-Apps/Graphics, /ROX-Apps/Audio, /ROX-Apps/Internet, etc... But something I would like is to make it NOT descend into subdirs with an AppRun script in it. For example, I don't like all OroboROX themes to be added... Anyone who knows find and can tell if this is possible? /Jonatan -=( http://kymatica.com )=- |
From: <pi...@wg...> - 2004-10-27 01:24:33
|
On Tue, Oct 26, 2004 at 07:21:39PM -0200, Jonatan Liljedahl wrote: > That's the nice thing with find, at least for me who has > /ROX-Apps/Graphics, /ROX-Apps/Audio, /ROX-Apps/Internet, etc... But > something I would like is to make it NOT descend into subdirs with an > AppRun script in it. For example, I don't like all OroboROX themes to be > added... Anyone who knows find and can tell if this is possible? You probably won't get find to do the job direclty unless you add some ugly multiline -and/-or/-not construct in find syntax. But: find . -type f -name AppRun -mindepth 2 -maxdepth 2 \ -exec dirname "{}" \; > negative provides the negative list of directories for the CWD. While: find . -type d -mindepth 1 -maxdepth 1 > alldirs provides the complete list. And: comm -3 alldirs negative (in this case) provides the needed intersection. Let some recurion do the rest. Not a smart unix pipe, but simple, stupid and you won't have problems with argument length and alike. If I'm right, it uses GNU find extensions, though :( |
From: Stephen W. <sw...@ul...> - 2004-10-26 14:31:20
|
>>> Ken Hayber <ke...@ha...> 26/Oct/2004 15:26:49 >>> >The 'find' version catches subdirs (e.g ~/Apps/Utilities). It appears yours doesn't (but it could >if you make a recursive function call). Yours would then have the benefit (?) of not relying on >any external resource. I deliberatly did not want to include subdirectories. |
From: <pi...@wg...> - 2004-10-26 11:49:25
|
On Mon, Oct 25, 2004 at 02:26:51PM +0100, Stephen Watson wrote: > >>> Peter Prohaska <pi...@wg...> 25/Oct/2004 07:04:58 >>> > >With a little adaption, the thing should now work for bash as well. > >If someone knows how to avoid the tempfile, please enlighten me. > > Ok, replace > echo "builtin hash -p $app $(basename $(dirname $app))" >> $T > with > eval builtin hash -p $app $(basename $(dirname $app)) Does not work for me and i don't see what the eval would change. It seems to me that it's the find while construct leads to execution of hash in some different context. find ... | while read app; do ... done I am not sure how bash evaluates this construct but the hash call in it had no effect on the current shell. You can check whith 'set -x' that the commands are sucessfully executed. Seems like something forks here. find ... -exec ... would lead to execution in a subshell, but the while construct... mmm. Someone with more bash understanding is welcomed to speak up. peter. |
From: Ken H. <ke...@ha...> - 2004-10-26 14:21:39
|
Peter Prohaska wrote: > On Mon, Oct 25, 2004 at 02:26:51PM +0100, Stephen Watson wrote: > >>>>>Peter Prohaska <pi...@wg...> 25/Oct/2004 07:04:58 >>> >>> >>>With a little adaption, the thing should now work for bash as well. >>>If someone knows how to avoid the tempfile, please enlighten me. >> >>Ok, replace >> echo "builtin hash -p $app $(basename $(dirname $app))" >> $T >>with >> eval builtin hash -p $app $(basename $(dirname $app)) > > > Does not work for me and i don't see what the eval would change. > It seems to me that it's the find while construct leads to execution of > hash in some different context. > find ... | while read app; do ... done > > I am not sure how bash evaluates this construct but the hash call in it > had no effect on the current shell. You can check whith 'set -x' that > the commands are sucessfully executed. Seems like something forks here. > find ... -exec ... > would lead to execution in a subshell, but the while construct... mmm. > Someone with more bash understanding is welcomed to speak up. > > peter. I made my version a bit like Jonatan's where your tempfile becomes the target output (~/.roxhash) which I then execute in my .profile. I put your script (rox-hash) in my ~/.local/bin dir and execute it only when things change. |