Re: Is there a special variable for the directory where the script is in?
pk a écrit : Peng Yu wrote: $0 gives the file name of the script. I could use several shell command to get the directory where the script is in. But I'm wondering if there is an easy-to-use variable that refers to the directory where the script is in? See this page: http://mywiki.wooledge.org/BashFAQ/028 This is well informed, very useful and very interesting page is considering the case where: - you want your widely distributed and very portable script to be called in any way from anywhere (including from a pipe from Mars). - hard-coding the location of your configuration files and libraries is not a problem. I am sure this is the most common case. But this is definitely not my case. Actually, my requirements are *the exact opposite*. For instance I do not want anyone to use my script but me. So I just do this instead: source $(dirname $0)/functions.sh The fact that it might break whenever someone else uses my script in a way I did not plan is a feature (in this respect, this code is even too robust).
Re: Is there a special variable for the directory where the script is in?
Marc a écrit : source $(dirname $0)/functions.sh I usually begin all my scripts with this beast: absolutiseScripts() { SCRIPTS=$1 ; echo $SCRIPTS | grep -q ^/ || SCRIPTS=`dirname $2`/$SCRIPTS ; } ; absolutiseScripts `command -v $0` `pwd`/. ; while [ -h $SCRIPTS ] ; do absolutiseScripts `readlink $SCRIPTS` $SCRIPTS ; done ; SCRIPTS=`dirname $SCRIPTS` I use it with bash on Mac OS X, FreeBSD, Linux, and it seems (just tested now at work) that HP/UX 11 with its bare sh can handle it. It does a lot of symlink-resolution, because I typically store my scripts in an src/scripts directory, with symlinks from $HOME/bin/tagadatsointsoin to $HOME/src/scripts/tagadatsointsoin. -- Guillaume
Re: Is there a special variable for the directory where the script is in?
On Fri, Feb 12, 2010 at 11:56:49AM +0100, Guillaume Outters wrote: I usually begin all my scripts with this beast: absolutiseScripts() { SCRIPTS=$1 ; echo $SCRIPTS | grep -q ^/ || SCRIPTS=`dirname $2`/$SCRIPTS ; } ; absolutiseScripts `command -v $0` `pwd`/. ; while [ -h $SCRIPTS ] ; do absolutiseScripts `readlink $SCRIPTS` $SCRIPTS ; done ; SCRIPTS=`dirname $SCRIPTS` I use it with bash on Mac OS X, FreeBSD, Linux, and it seems (just tested now at work) that HP/UX 11 with its bare sh can handle it. Except that HP-UX 10.20 and HP-UX 11.11 don't have readlink(1). (Maybe it's added in 11.2x? I don't know.)
Re: Is there a special variable for the directory where the script is in?
Greg a écrit : Except that HP-UX 10.20 and HP-UX 11.11 don't have readlink(1). (Maybe it's added in 11.2x? I don't know.) You're right. I must admit I made a concession to some GNU coreutils tools on the platform. I once used some ls -l $SCRIPTS | sed -e 's/.* - //' magic to replace it (and it worked two minutes ago on the HP-UX, just like it used to back in the old days). -- Guillaume
Re: Is there a special variable for the directory where the script is in?
Greg Wooledge wrote: That leaves names which contain -. The tricky part here is that we can't easily tell whether an extra - is in the symbolic link or in the target. imadev:~$ ln -s tmp 'x - y' imadev:~$ ln -s 'y - tmp' x imadev:~$ ls -ld x* lrwxr-xr-x 1 wooledgpgmr 8 Feb 12 09:28 x - y - tmp lrwxr-xr-x 1 wooledgpgmr 3 Feb 12 09:28 x - y - tmp However, there actually is enough information available to extract the desired part. When we call ls -l, we're passing it the filename we're resolving. So we already know the source name. Removing the source name and the ' - ' which follows it should leave us with the target name. link=$(command ls -l -- $file; printf x) link=${link%$'\nx'} remove=$file - file=${link#*$remove} Your solution using the original filename is better but I thought I would point out that the size of the target value is also displayed by 'ls -l'. In the above the value tmp is 3 characters and y - tmp is 8 characters and that value is displayed in the size field. So even without knowing the filename to be listed the result can be parsed to extract the target name. Bob
Re: Is there a special variable for the directory where the script is in?
Am 12.02.2010 15:39, schrieb Greg Wooledge: On Fri, Feb 12, 2010 at 02:53:39PM +0100, Bernd Eggink wrote: I once wrote a more generic shell function for this purpose, see: http://sudrala.de/en_d/shell-getlink.html You note that it doesn't handle names containing -, which is true. I'll get back to that at the end. It also won't handle any name that ls -l will refuse to print out correctly on any given system. Also, there are three more cases that it can't handle. The first is due to missing quotes in your command: echo ${link##*- } Without quotes, this will mangle all leading, trailing or repeated whitespace. Easily fixed by adding the quotes. (There are a few other cases of missing quotes too.) Thanks. I knew there were some missing cases, but when I wrote it, I didn't consider hardening the function against insane filenames worth the effort. However, it now begins to interest me if this is common practice. How big is the probability to stumble upon such filenames is in real life? Bernd -- Bernd Eggink http://sudrala.de
Re: Is there a special variable for the directory where the script is in?
Greg Wooledge wool...@eeg.ccf.org writes: And testing: imadev:~$ file=$HOME/x imadev:~$ link=$(command ls -l -- $file; printf x) imadev:~$ link=${link%$'\nx'} imadev:~$ remove=$file - imadev:~$ file=${link#*$remove} This lacks a pair of quotes (${link#*$remove}). Testcase: 'x[a]' - 'y'. Andreas. -- Andreas Schwab, sch...@linux-m68k.org GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 And now for something completely different.
Is there a special variable for the directory where the script is in?
$0 gives the file name of the script. I could use several shell command to get the directory where the script is in. But I'm wondering if there is an easy-to-use variable that refers to the directory where the script is in?
Re: Is there a special variable for the directory where the script is in?
On Fri, 12 Feb 2010, Peng Yu wrote: $0 gives the file name of the script. I could use several shell command to get the directory where the script is in. But I'm wondering if there is an easy-to-use variable that refers to the directory where the script is in? $0 normally gives the full path to the file, so: ${0%/*} -- Chris F.A. Johnson http://cfajohnson.com === Author: Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress) Pro Bash Programming: Scripting the GNU/Linux Shell (2009, Apress)
Re: Is there a special variable for the directory where the script is in?
Peng Yu wrote: $0 gives the file name of the script. I could use several shell command to get the directory where the script is in. But I'm wondering if there is an easy-to-use variable that refers to the directory where the script is in? See this page: http://mywiki.wooledge.org/BashFAQ/028
Re: Is there a special variable for the directory where the script is in?
According to Chris F.A. Johnson on 2/11/2010 4:23 PM: On Fri, 12 Feb 2010, Peng Yu wrote: $0 gives the file name of the script. I could use several shell command to get the directory where the script is in. But I'm wondering if there is an easy-to-use variable that refers to the directory where the script is in? $0 normally gives the full path to the file, so: ${0%/*} No, $0 normally gives the argv[0], which matches how the file was invoked. If it was invoked by absolute path (or even an anchored invocation, such as ./script), then you can compute it yourself. Otherwise, you have to recreate the PATH walk in your script to determine where the script was eventually located, and hope that the script was not invoked in such a way that argv[0] does not match the name of the script being run. Look at any configure script generated by autoconf for a sample of how complex it can be to portably locate $myself. -- Don't work too hard, make some time for fun as well! Eric Blake e...@byu.net signature.asc Description: OpenPGP digital signature
Re: Is there a special variable for the directory where the script is in?
On Thu, 11 Feb 2010, Eric Blake wrote: According to Chris F.A. Johnson on 2/11/2010 4:23 PM: On Fri, 12 Feb 2010, Peng Yu wrote: $0 gives the file name of the script. I could use several shell command to get the directory where the script is in. But I'm wondering if there is an easy-to-use variable that refers to the directory where the script is in? $0 normally gives the full path to the file, so: ${0%/*} No, $0 normally gives the argv[0], which matches how the file was invoked. Or, if it was found in $PATH, the full path to the file. That is how scripts are normally executed. If it was invoked by absolute path (or even an anchored invocation, such as ./script), then you can compute it yourself. Otherwise, you have to recreate the PATH walk in your script to determine where the script was eventually located, and hope that the script was not invoked in such a way that argv[0] does not match the name of the script being run. Look at any configure script generated by autoconf for a sample of how complex it can be to portably locate $myself. And, of course, there is rarely a good reason to need to know the location. -- Chris F.A. Johnson http://cfajohnson.com === Author: Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress) Pro Bash Programming: Scripting the GNU/Linux Shell (2009, Apress)