我写了一个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;
)