2014-12-24 4 views
4

TARGET DIR의 파일과 디렉토리를 반복하고 DESTINATION의 모든 디렉토리에 대한 심볼릭 링크를 작성하는 bash 스크립트를 작성했습니다 DIR. 스크립트는 작동하지만 ln 명령은 내가 말할 수있는 것보다> 0의 종료 코드를 제공하므로 적절한 성공 메시지가 인쇄되지 않습니다.ln -s 명령을 실행하는 bash 스크립트가 종료시에 오류 코드를 받고 있지만 심볼 링크가 성공적으로 생성되고 있습니다.

: HERE
[email protected]:/home/dog⟫ ls -la 
total 8 
drwxr-xr-x 2 obi obi 4096 Dec 24 11:13 . 
drwxr-xr-x 8 obi obi 4096 Dec 24 10:32 .. 

적지 하위 디렉토리 HERE

[email protected]:/home/dog⟫ ls /home/bud 
bzfs.conf Downloads   Music  Templates VirtualBox VMs 
Desktop examples.desktop Pictures vboxen  vmz 
Documents lab    Public Videos 

되는 출력 그것을 실행할 때 WITH 대상 디렉토리이다 HERE

스크립트를 실행하기 전에 목적지 디렉토리 인
[email protected]:/home/dog⟫ /home/obi/scripts/dirlink.sh        
/home/bud/Desktop failed to link to /home/dog/Desktop 
/home/bud/Documents failed to link to /home/dog/Documents 
/home/bud/Downloads failed to link to /home/dog/Downloads 
/home/bud/lab failed to link to /home/dog/lab 
/home/bud/Music failed to link to /home/dog/Music 
/home/bud/Pictures failed to link to /home/dog/Pictures 
/home/bud/Public failed to link to /home/dog/Public 
/home/bud/Templates failed to link to /home/dog/Templates 
/home/bud/vboxen failed to link to /home/dog/vboxen 
/home/bud/Videos failed to link to /home/dog/Videos 
/home/bud/VirtualBox VMs failed to link to /home/dog/VirtualBox VMs 
/home/bud/vmz failed to link to /home/dog/vmz 

추가 된 스크립트는 SYMLINKS가 추가 된 후 실행됩니다. 여기

[email protected]:/home/dog⟫ ls -la 
total 8 
drwxr-xr-x 2 obi obi 4096 Dec 24 11:13 . 
drwxr-xr-x 8 obi obi 4096 Dec 24 10:32 .. 
lrwxrwxrwx 1 obi obi 17 Dec 24 11:13 Desktop -> /home/bud/Desktop 
lrwxrwxrwx 1 obi obi 19 Dec 24 11:13 Documents -> /home/bud/Documents 
lrwxrwxrwx 1 obi obi 19 Dec 24 11:13 Downloads -> /home/bud/Downloads 
lrwxrwxrwx 1 obi obi 13 Dec 24 11:13 lab -> /home/bud/lab 
lrwxrwxrwx 1 obi obi 15 Dec 24 11:13 Music -> /home/bud/Music 
lrwxrwxrwx 1 obi obi 18 Dec 24 11:13 Pictures -> /home/bud/Pictures 
lrwxrwxrwx 1 obi obi 16 Dec 24 11:13 Public -> /home/bud/Public 
lrwxrwxrwx 1 obi obi 19 Dec 24 11:13 Templates -> /home/bud/Templates 
lrwxrwxrwx 1 obi obi 16 Dec 24 11:13 vboxen -> /home/bud/vboxen 
lrwxrwxrwx 1 obi obi 16 Dec 24 11:13 Videos -> /home/bud/Videos 
lrwxrwxrwx 1 obi obi 24 Dec 24 11:13 VirtualBox VMs -> /home/bud/VirtualBox VMs 
lrwxrwxrwx 1 obi obi 13 Dec 24 11:13 vmz -> /home/bud/vmz 

는 스크립트 자체입니다 :

#!/bin/bash 

SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 

TARDIR="/home/bud" 
DESTDIR="/home/dog" 

if [ ! -d $TARDIR ]; then 
     printf "$TARDIR does not exist!\n" 
     exit 
fi 

if [ ! -d $DESTDIR ]; then 
     printf "$DESTDIR does not exist!\n" 
     exit 
fi 


TARDIR="$TARDIR/*" 
for DIR in $TARDIR; do 
     if [ -d $DIR ]; then 
       printf "$DIR" 
       TARG="$DESTDIR/$(basename "$DIR")" 
       if [ $(ln -s "$DIR" "$TARG") ]; then 
         printf " ==> $TARG\n" 
       else 
         printf " failed to link to $TARG\n" 
       fi 
     fi 

done 

IFS=$SAVEIFS 

그래서, 결론은 스크립트가 작동하지만, [$은 (LN -s "$ DIR" "$ TARG은")] 0을 반환해야합니다 과의 printf "==> $의 TARG \ 없음"라인은 성공 메시지를 인쇄해야하지만, 대신에, 나는에 실패 하다며 링크 "를 얻을 대상 디렉토리가 비어있는 경우에도 메시지.

모든 아이디어/제안?

감사합니다.

+0

bash는 [ANSI-C quoting] (https://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting)이 있으므로'IFS = $ '\ n \ b'' 서브 쉘을 만들 필요없이 –

+0

또한'$ DIR'에 공백이나 와일드 카드 문자가 포함되어 있는지 알 수 없으므로 괄호 안에 넣으십시오 :'[-d "$ DIR"] '- bash에서 단어 분리와 파일명 확장의 대상이 아닌 * double * bracket의 변수입니다. –

+0

팁 주셔서 감사합니다. 나는 둘 다 추가했다. – obitori

답변

4

이 줄은 잘못된 것입니다 : ln이 성공하지 여부에 관계없이 모든 출력을 생성하는 경우

if [ $(ln -s "$DIR" "$TARG") ]; then 

그것은 테스트입니다. 로 변경 : 스크립트가 실패 할 경우

if ln -s "$DIR" "$TARG"; then 

아닌 값으로 stderr에 오류 메시지를 작성하는 습관을, 당신의 중복 인쇄를 제거하고 종료하십시오. (예 : printf 'this is an error' >&2; exit 1;)

+0

고맙습니다. 완전한. – obitori