root@MCIRPS2.MED.NYU.EDU (08/08/90)
After having clobbered too many very important files and directories that I wanted to make local symlinks to, I wrote the script below to make it more difficult for me to clobber my files with sgi symbolic links. Use it in good health. I would be interested in your improvements too! #! /bin/sh # Less dangerious and more user frendly front end for ln -s . # Prevents you from making symbolic linkages the wrong way and clobbering what # you want to link to. clear # . Version.mac #a macro that records who and how often this is used. file="$1" echo "Enter existing file you wish create a link to" if [ "$1" ] then echo "or enter a return to use $1" fi read file if [ -z "$file" ] then file=$1 fi if [ -x $file ] then echo "GOOD. $file exists" ls -ld $file else echo "$file does not exist" echo " How do you expect me to make a link to a file I can't find." echo " bad bad boy" exit 1 fi echo "\n\n" echo "Enter name of link to create $2" if [ -z "$2" ] then echo "or return to use `basename $file`" fi read link if [ -z "$link" ] then link=$2 fi if [ -z "$link" ] then link=`basename $file` echo "do you want me to use $link as your local link to \n$file ?" echo "\nReturn to continue,anything else aborts." read ans if [ -n "$ans" ] then exit 1 fi fi if [ -x $link ] then echo "bad bad bad boy, $link exists. If you don't believe me, look" ls -ld $link exit 1 else echo "nice kitty" echo " $link is ready to create" fi ln -s $file $link echo "\n\n" ls -ld $file $link | cut -c1-10,40- echo "$0 :Completed" # . End.mac exit 0 +-----------------------------------------------------------------------------+ | karron@nyu.edu Dan Karron | | . . . . . . . . . . . . . . New York University Medical Center | | 560 First Avenue \ \ Pager <1> (212) 397 9330 | | New York, New York 10016 \**\ <2> 10896 <3> <your-number-here> | | (212) 340 5210 \**\__________________________________________ | +-----------------------------------------------------------------------------+
vjs@rhyolite.wpd.sgi.com (Vernon Schryver) (08/08/90)
In article <9008072310.AA21830@mcirps2.med.nyu.edu>, root@MCIRPS2.MED.NYU.EDU writes: > > After having clobbered too many very important files and directories that > I wanted to make local symlinks to, I wrote the script below to > make it more difficult for me to clobber my files with sgi symbolic > links. ... Could you suggest improvements to the -i option of ln, as in `ln -si foo bar`, described in ln(1), to make ln as safe as your script? Vernon Schryver vjs@sgi.com
karron@MCIRPS2.MED.NYU.EDU (08/10/90)
The problem seems to be more than I first thought. If you want to make a link, It seems that you have to use a fully qualified file path or the symbolic link can get lost... Try to cd to some directory, and then link a file there back to another file link in a non local directory (some other directory other than the one you are using as your cwd). I have to fix the script (again) to fully expand a file name prior to making the links. I did not know that the ln -is option worked. I just tried it, and it gave me a cryptic warning "files identical". My problem is getting the order correct, so that I don't overwrite my file with a symlink pointing to itself. Anyway, sgi (youse guys) should fix it better. Perhaps if the code it not a trade secret, post it so we can make our own versions. Or just use a shell script front end, or just be more careful. The reason I am using links more and more is to save disk space, and not keep copies of hugh image files local, but on remote file systems with long path names. Keeping a local symlink is really neat ! dan(who should read the man page prior to solving the problem) +-----------------------------------------------------------------------------+ | karron@nyu.edu Dan Karron | | . . . . . . . . . . . . . . New York University Medical Center | | 560 First Avenue \ \ Pager <1> (212) 397 9330 | | New York, New York 10016 \**\ <2> 10896 <3> <your-number-here> | | (212) 340 5210 \**\__________________________________________ | +-----------------------------------------------------------------------------+
karron@MCIRPS2.MED.NYU.EDU (08/10/90)
There was a problem with creating links from outside your current working directory that I think I fixed in this version of the script, and a bug in file existance testing ( [ -x ] for [ -f ] ) that would not let you link to a nonexecutable file. I think that this works. While not the most artful shell script, This is what I use to protect myself from some of the problems with symbolic links. It has been pointed out to me that ln -si will prevent you from clobbering a file with a link too. Then my only improvement is that this script checks for existance of files to link to and qualifies file paths relative to root so that you can't get a dangling link (a linkage to a file that does not exist because it is being evaluated relative to some arbitrary current working location). Thanks for all your input, and I hope that this works better. ---------cut here-------------------------------------------------------------- #! /bin/sh # more user frendly front end for ln -s # prevents you from making linkages the wrong way and clobbering what # you want to LINK to. # # fully qualifies FILE and LINK names so you # don't get dangling linkages. clear #. Version.mac FILE="$1" if echo $FILE | egrep -s "^/" then echo "File name is fully qualified" else echo "File name being qualified" FILE_DIR_NAME=`dirname $FILE` FILE="`(cd $FILE_DIR_NAME;pwd)`/`basename $FILE`" fi echo "Enter existing file you wish create a link to" if [ "$1" ] then echo "or enter a return to use $FILE" fi read FILE if [ -z "$FILE" ] then FILE=$1 fi if echo $FILE | egrep -s "^/" then echo "File name is fully qualified" else echo "File name being qualified" FILE_DIR_NAME=`dirname $FILE` FILE="`(cd $FILE_DIR_NAME;pwd)`/`basename $FILE`" fi if [ -f $FILE ] then echo "GOOD. $FILE exists" ls -ld $FILE else echo "$FILE does not exist" echo " How do you expect me to make a link to a file I can't find." exit 1 fi echo "\n\n" LINK="$2" if echo $LINK | egrep -s "^/" then echo "Link name is fully qualified" else echo "Link name being qualified" LINK_DIR_NAME=`dirname $LINK` LINK="`(cd $LINK_DIR_NAME;pwd)`/`basename $LINK`" fi echo "Enter name of link to create $LINK" if [ -z "$2" ] then echo "or return to use `basename $FILE`" fi read LINK if [ -z "$LINK" ] then LINK=$2 fi if echo $LINK | egrep -s "^/" then echo "Link name is fully qualified" else echo "Link name being qualified" LINK_DIR_NAME=`dirname $LINK` LINK="`(cd $LINK_DIR_NAME;pwd)`/`basename $LINK`" fi if [ -z "$LINK" ] then LINK=`basename $FILE` echo "do you want me to use $LINK as your local LINK to \n$FILE ?" echo "\nReturn to continue,anything else aborts." read ans if [ -n "$ans" ] then exit 1 fi fi if [ -f $LINK ] then echo "bad bad bad boy, $LINK exists. If you don't believe me, look" ls -ld $LINK exit 1 else echo "nice kitty" echo " $LINK is ready to create" fi ln -s $FILE $LINK echo "\n\n" ls -ld $FILE $LINK | cut -c1-10,40- echo "$0 : Completed" # . End.mac exit 0 +-----------------------------------------------------------------------------+ | karron@nyu.edu Dan Karron | | . . . . . . . . . . . . . . New York University Medical Center | | 560 First Avenue \ \ Pager <1> (212) 397 9330 | | New York, New York 10016 \**\ <2> 10896 <3> <your-number-here> | | (212) 340 5210 \**\__________________________________________ | +-----------------------------------------------------------------------------+
karron@MCIRPS2.MED.NYU.EDU (08/13/90)
I guess that you wrote tlink(1) ? It looks like you have done what I wanted to do only did not think about it yet. Great! You might want to get sgi to put a cross reference in the man page for link to your tlink. That would clue us in to your good work. Dangling links: Here is how I get dangling links ... cut----------------------------------------------------------------------- #! /bin/sh # run this below / so you don't hit your head # on the root directory... rm -rf D.DangleDirectory REAL_FILE cd $HOME mkdir D.DangleDirectory echo "THE REAL FILE CONTENTS" > REAL_FILE pwd ln -s REAL_FILE D.DangleDirectory/SYMLINK ls -l REAL_FILE ls -l D.DangleDirectory/SYMLINK cat D.DangleDirectory/SYMLINK cd D.DangleDirectory pwd ls -l SYMLINK cat SYMLINK echo "try more qualified names" cd $HOME ln -s ./REAL_FILE ./D.DangleDirectory/SYMLINK1 ls -l REAL_FILE ls -l ./D.DangleDirectory/SYMLINK1 cat ./D.DangleDirectory/SYMLINK1 cd D.DangleDirectory pwd ls -l ./SYMLINK1 cat ./SYMLINK1 echo "now try doing it the expected way" cd $HOME cd D.DangleDirectory pwd ln -s ../REAL_FILE SYMLINK2 ls -l ../REAL_FILE ls -l SYMLINK2 cat SYMLINK2 echo "try fully qualified names" cd $HOME pwd ln -s $HOME/REAL_FILE $HOME/D.DangleDirectory/QUALIFIED_LINK ls -l $HOME/REAL_FILE ls -l $HOME/D.DangleDirectory/QUALIFIED_LINK cat $HOME/D.DangleDirectory/QUALIFIED_LINK cd D.DangleDirectory pwd ls -l QUALIFIED_LINK cat QUALIFIED_LINK exit 0 cut-----------------------running the above will give you this----------------- /karron -rw-r--r-- 1 root mail 23 Aug 13 11:41 REAL_FILE l--------- 1 root mail 9 Aug 13 11:41 D.DangleDirectory/SYMLINK -> REAL_FILE cat: cannot open D.DangleDirectory/SYMLINK /karron/D.DangleDirectory l--------- 1 root mail 9 Aug 13 11:41 SYMLINK -> REAL_FILE cat: cannot open SYMLINK try more qualified names -rw-r--r-- 1 root mail 23 Aug 13 11:41 REAL_FILE l--------- 1 root mail 11 Aug 13 11:41 ./D.DangleDirectory/SYMLIN K1 -> ./REAL_FILE cat: cannot open ./D.DangleDirectory/SYMLINK1 /karron/D.DangleDirectory l--------- 1 root mail 11 Aug 13 11:41 ./SYMLINK1 -> ./REAL_FILE cat: cannot open ./SYMLINK1 now try doing it the expected way /karron/D.DangleDirectory -rw-r--r-- 1 root mail 23 Aug 13 11:41 ../REAL_FILE l--------- 1 root mail 12 Aug 13 11:41 SYMLINK2 -> ../REAL_FILE THE REAL FILE CONTENTS try fully qualified names /karron -rw-r--r-- 1 root mail 23 Aug 13 11:41 /karron/REAL_FILE l--------- 1 root mail 17 Aug 13 11:41 /karron/D.DangleDirectory/ QUALIFIED_LINK -> /karron/REAL_FILE THE REAL FILE CONTENTS /karron/D.DangleDirectory l--------- 1 root mail 17 Aug 13 11:41 QUALIFIED_LINK -> /karron/ REAL_FILE THE REAL FILE CONTENTS +-----------------------------------------------------------------------------+ | karron@nyu.edu Dan Karron | | . . . . . . . . . . . . . . New York University Medical Center | | 560 First Avenue \ \ Pager <1> (212) 397 9330 | | New York, New York 10016 \**\ <2> 10896 <3> <your-number-here> | | (212) 340 5210 \**\__________________________________________ | +-----------------------------------------------------------------------------+