단일 인수를 사용하면 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