単一引数を使用すると、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