Почему ln -s принимает один аргумент

27
> cd /tmp
> ln -s foo
> ls -alhF /tmp
lrwxrwxrwx 1 user user    3 Jul 29 14:00 foo -> foo

Это ошибка lnили есть вариант использования для ссылки на файл для себя?

Это с coreutils 8.21-1ubuntu5.1.

Squidly
источник

Ответы:

45

Это не ошибка. Вариант использования для случая, когда вы хотите связать файл с тем же базовым именем, но в другом каталоге:

cd /tmp
ln -s /etc/passwd
ls -l passwd
lrwxrwxrwx 1 xxx xxx 11 Jul 29 09:10 passwd -> /etc/passwd

Это правда, что когда вы делаете это с именем файла, находящимся в том же каталоге, он создает ссылку на себя, которая не приносит много пользы!

Это работает независимо от того, используете ли вы символические или жесткие ссылки.

Celada
источник
15
Другой способ выразить это: ln -s /path/to/fileэто сокращение от ln -s /path/to/file .. Как lsэто сокращенно для ls ..
Стефан Шазелас
3
@ StéphaneChazelas да, и вы экономите два целых нажатия клавиш! :-)
Селада
4
Обратите внимание, что это поведение не указано в POSIX, но кажется довольно распространенным (GNU, busybox, FreeBSD, Solaris, Ultrix, по крайней мере, и уже было таким (хотя -s, конечно, не поддерживалось) в первой версии Unix в начале 70-х годов).
Стефан Шазелас
9

Конечно, самый простой способ узнать это - попробовать и посмотреть. Когда второй аргумент не указан, lnв текущем каталоге будет создана ссылка с тем же именем, что и в оригинале:

$ ln -s /etc
$ ls -l
lrwxrwxrwx 1 terdon terdon         4 Jul 29 16:09 etc -> /etc

Это также объясняется в man ln:

Во 2-й форме создайте ссылку на TARGET в текущем каталоге.

«Вторая форма» относится к:

ln [ОПЦИЯ] ... TARGET (2-ой класс)

Тердон
источник