[20231207]bash ln建立软链接问题.txt

发布时间 2023-12-12 20:50:25作者: lfree
[20231207]bash ln建立软链接问题.txt

--//以前写的链接:http://blog.itpub.net/267265/viewspace-2753238/=>[20210126]bash ln建立软链接问题.txt
--//我个人喜欢在oracle目录下建立一个fastlink目录,里面包含一些经常进入的目录链接。

$ ls -l
total 0
lrwxrwxrwx 1 oracle oinstall 32 2023-12-07 16:27:52 adump -> /u01/app/oracle/admin/book/adump
lrwxrwxrwx 1 oracle oinstall 42 2023-12-07 16:27:52 bdump -> /u01/app/oracle/diag/rdbms/book/book/trace
lrwxrwxrwx 1 oracle oinstall 45 2023-12-07 16:27:45 dbs -> /u01/app/oracle/product/11.2.0.4/dbhome_1/dbs
lrwxrwxrwx 1 oracle oinstall 20 2023-12-07 16:27:46 diag -> /u01/app/oracle/diag
lrwxrwxrwx 1 oracle oinstall 33 2023-12-07 16:27:48 dp -> /u01/app/oracle/admin/book/dpdump
lrwxrwxrwx 1 oracle oinstall 55 2023-12-07 16:27:46 net -> /u01/app/oracle/product/11.2.0.4/dbhome_1/network/admin
lrwxrwxrwx 1 oracle oinstall 15 2023-12-07 16:27:48 ob -> /u01/app/oracle
lrwxrwxrwx 1 oracle oinstall 41 2023-12-07 16:27:47 oh -> /u01/app/oracle/product/11.2.0.4/dbhome_1
lrwxrwxrwx 1 oracle oinstall 55 2023-12-07 16:27:47 tns -> /u01/app/oracle/product/11.2.0.4/dbhome_1/network/admin
lrwxrwxrwx 1 oracle oinstall 42 2023-12-07 16:27:53 udump -> /u01/app/oracle/diag/rdbms/book/book/trace

--//这样如果需要到某个目录。直接cd dbs就可以了。例子:

$ cd net
[~/fastlink/net ] $

$ cd -P net
--//加入-P 避开软链接。一般一些提示里面包含路径,如果没有-P ,提示行信息显示的软链接(如上的例子)。
$ pwd
/u01/app/oracle/product/11.2.0.4/dbhome_1/network/admin

--//这样可以快速进入我需要的目录。我当时写了一个脚本完成这些建立软链接的目录。
--//我当时脚本里面执行的是 ln -s -i $ORACLE_HOME/dbs dbs
--//这样第2次执行会形成1个环,参考链接http://blog.itpub.net/267265/viewspace-2753238/.

--//今天终于知道如何解决这个问题,加入-T参数就可以了。
-T, --no-target-directory
    treat LINK_NAME as a normal file

--//演示:
$ cd fastlink
$ rm dbs
/bin/rm: remove symbolic link `dbs'? y

$ ln -sT -i $ORACLE_HOME/dbs dbs
$ ln -sT -i $ORACLE_HOME/dbs dbs
/bin/ln: replace `dbs'? y

--//这样就不会出现环的问题。

$ cd -P dbs
$ pwd
/u01/app/oracle/product/11.2.0.4/dbhome_1/dbs

$ ls -l | grep dbs
--//dbs目录下不再存在一个dbs目录。

--//我自己还建立一个函数cdp。
$ type cdp
cdp is a function
cdp ()
{
    if [ ! -d ~/fastlink ]; then
        echo 'not fount ~/fastlink! create it';
        return 1;
    fi;
    if [ -z $1 ]; then
        cd ~/fastlink;
        ls --color=auto --time-style=+"%Y-%m-%d %H:%M:%S" -l --color=auto --time-style=+"%Y-%m-%d %H:%M:%S";
        return 0;
    fi;
    if [ -n $1 ]; then
        if [ -L $1 ]; then
            cd -P $1;
            return 0;
        fi;
        if [ -L ~/fastlink/$1 ]; then
            cd -P ~/fastlink/$1;
            return 0;
        fi;
    fi;
    echo "not found directory $1 !!"
}

--//cdp 没有参数直接显示fastlink的目录内容。
--//cdp <目录>,直接进入目录,而且可以在任何其它目录执行。

--//附上建立软链接目录脚本:

#! /bin/bash
#
# fast cd directory (11g 12c)

[ _"$DEBUG" = _ON ] && set -x

fastlinkdebug=${FASTLINKDEBUG:-1}

echo
read -p "before run ,check and rmdir /home/oracle/fastlink directory !!! ctrl_c exit:" a

[ -n "$ORACLE_SID"                       ] || { echo 'setup ORACLE_SID'   ; return 1 ; }
[ -n "$ORACLE_BASE" -a -d "$ORACLE_BASE" ] || { echo 'setup ORACLE_BASE'  ; return 2 ; }
[ -n "$ORACLE_HOME" -a -d "$ORACLE_HOME" ] || { echo 'setup ORACLE_HOME'  ; return 3 ; }

if [ $fastlinkdebug -eq 1 ] ; then
    echo
    echo ORACLE_SID = $ORACLE_SID
    echo ORACLE_BASE = $ORACLE_BASE
    echo ORACLE_HOME = $ORACLE_HOME
    echo
    read -p "check variable ORACLE_SID ORACLE_BASE ORACLE_HOME, ctrl_c exit:" a
fi


wc_count=$(ps -ef | grep [o]ra_pmon_${ORACLE_SID}|wc -l)

if [ $wc_count -eq 1 ] ; then
otrace=$(sqlplus -S -l / as sysdba <<EOF
set head off
set feedback off
select VALUE from v\$diag_info where name='Diag Trace';
quit
EOF
)

oadump=$(sqlplus -S -l / as sysdba <<EOF
set head off
set feedback off
select VALUE from v\$parameter where name='audit_file_dest';
quit
EOF
)

ORACLE_UNQNAME=$(sqlplus -S -l / as sysdba <<EOF
set head off
set feedback off
select VALUE from v\$parameter where name='db_unique_name';
quit
EOF
)
fi

mkdir -p /home/oracle/fastlink && cd  /home/oracle/fastlink || return 5

[ -d $ORACLE_HOME/dbs                            ] && ln -sT -i $ORACLE_HOME/dbs dbs
[ -d $ORACLE_BASE/diag                           ] && ln -sT -i $ORACLE_BASE/diag diag
[ -d $ORACLE_HOME/network/admin                  ] && ln -sT -i $ORACLE_HOME/network/admin net
[ -d $ORACLE_HOME/network/admin                  ] && ln -sT -i $ORACLE_HOME/network/admin tns
[ -d $ORACLE_HOME                                ] && ln -sT -i $ORACLE_HOME oh
[ -d $ORACLE_BASE                                ] && ln -sT -i $ORACLE_BASE ob
[ -d $ORACLE_BASE/admin/${ORACLE_SID}/dpdump     ] && ln -sT -i $ORACLE_BASE/admin/${ORACLE_SID}/dpdump dp

##################################
# delete otrace ,oadump of new line.
##################################

otrace=$(echo $otrace)
oadump=$(echo $oadump)
ORACLE_UNQNAME=$(echo $ORACLE_UNQNAME)

if [ $fastlinkdebug -eq 1 ] ; then
    echo
    echo otrace = "$otrace"
    echo oadump = "$oadump"
    echo ORACLE_UNQNAME = "$ORACLE_UNQNAME"
    echo
    read -p "check variable otrace,oadump ,ctrl_c exit:" a
fi


[ -n "$otrace" ]  ||  return 6
[ -n "$oadump" ]  ||  return 7
[ -n "$ORACLE_UNQNAME" ]  ||  return 7

export ORACLE_UNQNAME=$ORACLE_UNQNAME

mkdir -p /home/oracle/fastlink && cd  /home/oracle/fastlink || return 8

[ -d "$oadump" ] && ln -sT -i $oadump adump
[ -d "$otrace" ] && ln -sT -i $otrace bdump
[ -d "$otrace" ] && ln -sT -i $otrace udump

ls -l

echo
echo "fastlink create ok!!"
echo