Dlaczego ln -s akceptuje pojedynczy argument

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

Czy jest to błąd lnlub czy istnieje przypadek użycia do dowiązania pliku do siebie?

To jest z coreutils 8.21-1ubuntu5.1.

Kałamarnica
źródło

Odpowiedzi:

45

To nie jest błąd. Przypadek użycia dotyczy przypadku, gdy chcesz połączyć plik z tą samą nazwą basename, ale w innym katalogu:

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

Prawdą jest, że kiedy robisz to z nazwą pliku, która znajduje się w tym samym katalogu, tworzy link do siebie, co nie robi wiele dobrego!

Działa to niezależnie od tego, czy używasz dowiązań symbolicznych, czy dowiązań twardych.

Celada
źródło
15
Inaczej mówiąc: ln -s /path/to/filejest skrótem ln -s /path/to/file .. Skrót lsjest jak ls ..
Stéphane Chazelas
3
@ StéphaneChazelas tak, a ty zapisujesz dwa pełne naciśnięcia klawiszy! :-)
Celada,
4
Zauważ, że takie zachowanie nie jest określone przez POSIX, ale wydaje się być dość powszechne (przynajmniej GNU, busybox, FreeBSD, Solaris, Ultrix, i już tak było (chociaż -s nie było oczywiście obsługiwane) w pierwszej wersji Uniksa na początku lat 70.).
Stéphane Chazelas
9

Najłatwiejszym sposobem na znalezienie tego jest oczywiście wypróbowanie go i zobaczenie. Jeśli nie podano drugiego argumentu, lnutworzy link w bieżącym katalogu o takiej samej nazwie jak oryginał:

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

Wyjaśnia to również man ln:

W drugim formularzu utwórz link do TARGET w bieżącym katalogu.

„Drugi formularz” odnosi się do:

ln [OPCJA] ... TARGET (2. formularz)

terdon
źródło