2014-12-24 2 views
4

Я написал сценарий bash, который должен перебирать файлы и каталоги в TARGET DIR и создавать символическую ссылку для всех каталогов в DESTINATION DIR. Сценарий работает, но команда ln дает код выхода из> 0 из того, что я могу сказать, и поэтому соответствующее сообщение успеха не печатается.скрипт bash, который выполняет команду ln -s, получает код ошибки при выходе, но 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 .. 

ВОТ TARGET каталог с уже несколько поддиректорий

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

Вот выход когда я запускаю его:

[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 

ЗДЕСЬ НАЗНАЧЕНИЕ ПОСЛЕ ПРОВЕДЕНИЯ СЦЕНАРИЙ С СИНМИНКАМИ.

[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 

Таким образом, нижняя строка скрипт работает, но [$ (пер -s "$ DIR" "$ TARG")] должна возвращать ноль и Printf «==> $ TARG \ п» линия должна напечатать сообщение об успехе, но вместо этого я получаю отказавшего отъ ссылку на»сообщение, даже если каталог назначения пуст.

Любые идеи/предложения?

Спасибо!

+0

Обратите внимание, что bash имеет [ANSI-C цитирование] (https://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting), поэтому вы можете написать 'IFS = $ '\ n \ b'' без создания подоболочки –

+0

Кроме того, вы не знаете, содержат ли '$ DIR' пробелы или символы подстановочных знаков, поэтому цитируйте их в одиночных скобках:' [-d "$ DIR"] '- в bash это переменные в * двойных * скобках, которые не подлежат разбиению слов и расширению имени файла. –

+0

Спасибо за советы. Я добавил оба. – obitori

ответ

4

Эта линия является неправильным:

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

Это испытание, если ln генерирует какой-либо вывод, не является ли или не удастся его. Измените его на:

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

Просим удалить избыточную печать, получить в привычку писать сообщения об ошибках в стандартный поток ошибок, и выйти с ненулевым значением, если ваш сценарий не удается. (например, printf 'this is an error' >&2; exit 1;))

+0

Спасибо. Отлично. – obitori