Я написал сценарий 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 \ п» линия должна напечатать сообщение об успехе, но вместо этого я получаю отказавшего отъ ссылку на»сообщение, даже если каталог назначения пуст.
Любые идеи/предложения?
Спасибо!
Обратите внимание, что bash имеет [ANSI-C цитирование] (https://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting), поэтому вы можете написать 'IFS = $ '\ n \ b'' без создания подоболочки –
Кроме того, вы не знаете, содержат ли '$ DIR' пробелы или символы подстановочных знаков, поэтому цитируйте их в одиночных скобках:' [-d "$ DIR"] '- в bash это переменные в * двойных * скобках, которые не подлежат разбиению слов и расширению имени файла. –
Спасибо за советы. Я добавил оба. – obitori