使用单个参数,ln -s
将在当前目录中创建一个符号链接:
$ ls /opt/my_tests
hello_world.c hello_world
$
$ echo $PWD
/home/chris/my_links
$ ln -s /opt/my_tests/hello_world.c
$ ls -l
lrwxrwxrwx 1 chris chris 28 May 3 13:08 hello_world.c -> /opt/my_tests/hello_world.c
但是,如果我尝试在 for 循环中执行此操作,它会认为该文件存在:
$ for f in "/opt/my_tests/*"
> do
> ln -s $f
> done
ln: failed to create symbolic link '/opt/my_tests/hello_world.c': File exists
我误解/做错了什么?
答案1
您的问题是您引用了 glob,这导致它在 for 循环求值时不会被扩展。稍后您将得到一个裸露的、未加引号的$f
,它扩展了先前引用的 glob 并导致所有与该 glob 匹配的文件立即传递到ln
.
比较:
$ touch foo bar baz
$ for file in "*"; do echo ln -s $file; done
ln -s bar baz foo
$ for file in *; do echo ln -s "$file"; done
ln -s bar
ln -s baz
ln -s foo
因此,您真正想要的是在 for 循环求值时扩展 glob,然后引用结果项(带或不带引号 for /opt/my_tests/
):
for file in /opt/my_tests/*; do
ln -s "$file"
done