执行ln -s命令的bash脚本在退出时得到错误代码,但符号链接正在成功创build

我写了一个bash脚本,该脚本应该遍历TARGET DIR中的文件和目录,并为DESTINATION DIR中的所有目录创build一个符号链接。 该脚本的作品,但ln命令是从我所能告诉的退出代码> 0,所以适当的成功消息不打印。

这是执行脚本之前的目的地名录:

obi@Hanzomon:/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 .. 

这是目标很多的子目录目录

 obi@Hanzomon:/home/dog⟫ ls /home/bud bzfs.conf Downloads Music Templates VirtualBox VMs Desktop examples.desktop Pictures vboxen vmz Documents lab Public Videos 

这是我运行时的输出:

 obi@Hanzomon:/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 

这里是在脚本运行后joinSYMLINKS的目的地。

 obi@Hanzomon:/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”)]应该返回一个零,并且printf“==> $ TARG \ n”行应该打印成功消息,但相反,即使目的地目录是空的,我也会收到一个失败的“链接”消息。

任何想法/build议?

谢谢!

这一行是错误的:

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

它正在测试ln是否产生任何输出,而不是它是否成功。 将其更改为:

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

请删除冗余打印,养成写错误信息到stderr的习惯,如果脚本失败,请退出非零值。 (例如, printf 'this is an error' >&2; exit 1;