Kiat untuk mengingat urutan parameter untuk ln?

64

Saya sudah terbiasa lnmenulis tautan simbolik selama bertahun-tahun, tetapi saya masih mendapatkan urutan parameter yang salah di sekitar.

Ini biasanya membuat saya menulis:

ln -s a b

dan kemudian melihat output untuk mengingatkan diriku.

Saya selalu membayangkan menjadi a -> bseperti yang saya baca ketika itu sebenarnya sebaliknya b -> a. Ini terasa kontra-intuitif sehingga saya menemukan bahwa saya selalu menebak-nebak sendiri.

Adakah yang punya tips untuk membantu saya mengingat urutan yang benar?

Zhro
sumber
11
kadang-kadang membantu untuk mengatakannya lebih keras ketika Anda mengetiknya di "tautan simbolis ke a, dan sebut saja b"
jsotola
2
Anda membuat parameter kedua seperti dengan cp, dan Anda membuat tautan. Tetapi jika Anda mendapatkannya dengan cara yang salah, jangan khawatir, karena Anda tidak dapat menimpa file yang ada atau symlink dengan tautan baru.
sudodus
1
Terkait: Arah symlink
G-Man Mengatakan 'Reinstate Monica'
1
Anggap saja sebagai "alias orang jahat." Dia selalu disebut dengan nama aslinya terlebih dahulu, lalu alias. Mis: Tony Baloney alias Oscar Meyer. Atau dalam kasus tautan Anda, ln -sab berarti "File-a juga dikenal sebagai File-b".
Scottie H
1
ln source target. Sama seperti cp source target, mv source target; ...
user207421

Jawaban:

40

Saya menggunakan yang berikut ini: lnmemiliki formulir satu argumen (formulir ke-2 yang tercantum di halaman manual ) di mana hanya target yang diperlukan (karena bagaimana bisa lnbekerja sama sekali tanpa mengetahui target) dan lnmembuat tautan di direktori saat ini. Bentuk dua argumen adalah tambahan untuk bentuk satu argumen, sehingga target selalu argumen pertama.

gary
sumber
3
Perhatikan bahwa formulir tanpa jalur tujuan / target adalah ekstensi untuk spesifikasi POSIX dari ln.
Kusalananda
1
@kusa: apakah Anda melihat manual 1971 dalam jawaban saya dengan formulir satu argumen? Bagaimana itu bisa menjadi ekstensi untuk posix jika itu ada di tahun 1971? --- "Jika name2 diberikan, tautannya memiliki nama itu"
@ SP Saya tidak yakin saya mengerti maksud Anda. Apakah Anda mengatakan bahwa implementasi historis entah bagaimana mengalahkan standar POSIX saat ini?
Kusalananda
1
Saya juga melihat. Nama yang berbeda, argumen yang sama, setidaknya. Saya tidak tahu gnu adalah satu-satunya dengan nama-nama arg ini.
2
Ada banyak jawaban bagus di sini (terutama sajak oleh @loa_in_) tetapi saya akan menjawab yang ini. Menyatakan bahwa urutan parameter konsisten (mengabaikan -t) maka rasanya hampir seperti bukti. " lnMembuat tautan di direktori saat ini. Bentuk dua argumen adalah tambahan untuk bentuk satu argumen dan karenanya target selalu argumen pertama". Karena masuk akal bahwa ini akan menjadi kasus ketika mempertimbangkan bentuk kedua, saya pikir ini akan membantu saya mengingat.
Zhro
85

Saya pergi " lnadalah seperti cp. 'Sumber' harus didahulukan."

Hermann
sumber
20
... dan suka mv. mv, cpdan lnsemua mengambil file yang ada sebagai argumen pertama, dan file tujuan atau nama direktori yang dimaksud sebagai argumen kedua.
Hans-Martin Mosner
7
Sayang sekali memcpy, strcpydll bekerja sebaliknya.
Arkadiusz Drabczyk
6
@ Hans-MartinMosner, kecuali bahwa ketika Anda membuat tautan simbolik, itu tidak harus berupa file yang sudah ada ...
ilkkachu
1
@ilkkachu Anda benar. Tidak ada aturan tanpa kecuali :-)
Hans-Martin Mosner
1
@ArkadiuszDrabczyk Di sisi lain, sesuatu seperti memcpy(dest,src,n);peta sangat baik dest = src;. Dengan kata lain, set ( nbyte pertama ) dest sama dengan ( nbyte pertama ) src.
CVn
10

Kebanyakan Unices mendokumentasikan lnperintah tersebut sebagai

ln source target

(Saya menghilangkan opsi dll di sini)

Contoh:

  • Standar POSIX

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD :

    ln [-fhLnPs] source [target]
    
  • NetBSD dan FreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • macOS

    ln [-Ffhinsv] source_file [target_file]
    
  • Solaris

    /usr/bin/ln [-fns] source_file [target]
    
  • AIX

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

GNU lnpengguna menyebut source sasaran dan target LinkName .

Mengabaikan pilihan GNU kata-kata, lnutilitas berikut jenis yang sama semantik sebagai misalnya mvdan cpdalam yang sasaran adalah apa yang diciptakan dari sumber .

Karena itu,

ln -s a b

akan membuat tautan simbolik yang bmenunjuk ke a.

Perhatikan juga bahwa saat membuat tautan simbolik , sumber hanyalah string yang menunjukkan apa yang harus ditunjukkan oleh tautan simbolik. Biasanya tidak ada pemeriksaan yang dilakukan untuk memvalidasi bahwa itu menunjuk ke sesuatu yang berguna:

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world
Kusalananda
sumber
5
Saya sepenuhnya menyalahkan dokumentasi GNU atas fakta bahwa orang salah dalam hal ini. Kata-kata mereka dapat dipahami di belakang tetapi membingungkan secara objektif.
Konrad Rudolph
6
@KonradRudolph, Sebaliknya, kata-kata GNU tampaknya tepat bagi saya. Utilitas membuat tautan dengan beberapa nama, menunjuk ke suatu tempat. "Link nama" agak jelas, dan "target" adalah deskripsi yang sangat baik untuk sesuatu yang menunjuk ke . Sebagai anekdot, kadang-kadang saya masih harus berpikir cara mana yang ln -s a bbekerja, dan itu tidak ada hubungannya dengan kata-kata GNU, karena saya tidak berpikir saya pernah melihat ungkapan dalam halaman manual. : D (Lebih mudah dijalankan ln -si a bjika tidak yakin, itu akan mengeluh jika bsudah ada.)
ilkkachu
1
@KonradRudolph, meskipun secara teknis, menyebutnya "target" dalam kasus tautan keras salah , karena itu bukan nama yang ada tetapi inode yang menjadi target sebenarnya. Saya ingin tahu apakah orang-orang GNU berpikir bahwa pengguna biasa tidak harus memikirkannya dengan sangat rinci.
ilkkachu
Sangat menarik untuk ditunjukkan, sebagaimana disebutkan dalam komentar jawaban @ gary, bahwa target tersebut tidak opsional dalam standar POSIX.
Zhro
@kusa: dengan "ln -s AB --- salin hanya nama file ke B" Saya telah mengadopsi interpretasi Anda dalam konteks yang sedikit berubah. Saya bahkan bisa setuju dengan contoh "halo dunia" Anda yang radikal. "Hanya nama file 'IS string. Hanya ingin memberi sinyal kepada Anda bahwa saya mengedit sedikit dan menambahkan banyak.
7

Dalam hal ini membantu orang: Saya sudah terbiasa untuk berpikir sebagai "ln apa di mana ", yang membantu saya ingat bahwa argumen pertama ( "apa") adalah file yang ada, yang kedua ( "di mana") adalah tempat untuk menempatkan (tautan ke) itu. Berlawanan dengan alasan di sebagian besar jawaban lain, ini tidak lebih dari sebuah frase bernada rendah yang secara mental dapat saya ucapkan kepada diri saya sendiri ketika saya mengetik perintah, yang berfungsi sebagai bantuan memori. Ini mungkin tidak akan berguna bagi semua orang, tetapi saya menduga itu akan membantu beberapa orang.

Ini membantu bahwa perintah manipulasi file standar lainnya menggunakan konvensi yang sama, jadi saya dapat melakukan hal yang sama untuk cpdan mv.

David Z
sumber
4
Saya ingin tahu mengapa ini diturunkan. Tidak banyak yang salah di sini - apakah saya mencampuradukkan pesanan atau sesuatu?
David Z
Saya pribadi berpikir bahwa "Di tempat apa" masih tidak ambigu tanpa penjelasan: apa yang bisa menjadi "apa yang dimaksud dengan tautan yang mengarah?" (benar) atau "apa yang menghubungkan ke sesuatu?" (salah). Sama dengan di mana: "ke mana tautan menunjuk?" (salah) atau "di mana tautan harus dibuat" (benar). Jadi ini tidak selalu banyak membantu jika Anda menebak-nebak diri Anda sendiri. Mengingat cp dan mv akan membantu.
125_m_125
Kita semua mengharapkan perintah UNIX untuk menyertakan file argumennya setelah jenis argumen lainnya (seperti halnya grep, untuk exmaple). Pada membuat file jenis tertentu dengan konten yang diberikan. Bahwa filesystem melakukan sesuatu yang istimewa dan kami biasanya meletakkan path ke beberapa file sumber di dalamnya insidental ke ln. Sebagai contoh, saya dapat menulis editor teks yang menyimpan konten dari baris pertama di symlink yang disebut 1, dll. Ini akan sangat bodoh tetapi menekankan bahwa ln membuat beberapa jenis file dengan beberapa konten teks, tidak lebih atau kurang, dan membuat urutan argumen tampak logis.
Dannie
@ 125_m_125 Interpretasi alternatif yang Anda berikan tidak masuk akal bagi saya, tapi tidak apa-apa; bantuan memori ini bukan untuk semua orang.
David Z
6

Baru-baru ini saya mendengar cara yang bagus untuk mengingat hal khusus ini: sajak

Sesuatu yang lama, sesuatu yang baru,

sesuatu yang dipinjam, sesuatu yang biru,

dan enam pence di sepatunya.

Ayat pertama adalah argumen ln: sesuatu yang lama diikuti dengan nama entri direktori baru.

loa_in_
sumber
3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

Dari 1971 Manual Edisi Pertama Unix .

Ada bentuk sintaksis kedua yang sederhana.


edit: Aku meletakkan FILE atau FILENAME bukan TARGET --- lihat komentar dll lihat juga tambahan yang sangat panjang di bagian bawah, mengatasi gunung es, keras dan lunak dari ln, bukan hanya ujung itu.


Jadi GNU lnmemiliki ini:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

di mana Anda tidak memerlukan nama tautan. Setelah ln -s /usr/lib/modulesAnda mendapatkan

modules -> /usr/lib/modules

dengan nama yang sama dengan FILENAME ("target" atau "source"), tepat di tempat Anda berada. Tidak ada pilihan, tidak ada kebingungan.

Sekarang jika Anda lebih menuntut dan ingin tautan dibuat dengan nama lain dan / atau di tempat lain , Anda menambahkan keinginan itu sebagai nama atau jalur. Target sebenarnya datang pertama, fantasi tambahan nama tautan baru kedua.


Atau Anda berkata: "Saya tahu tanda panah ini ls -luntuk tautan. Saya tidak punya panah di shell untuk menunjukkan arah tautan saya. Jadi saya harus memutarnya."

Anda membuatnya di satu arah, sehingga Anda bisa menggunakannya di sisi lain.

(AKHIR BAGIAN JAWABAN-THE-PERTANYAAN)


Pada level lain, kata "tautan" itu sendiri mengandung makna ganda yang tersembunyi. Tautan simbolik muncul kemudian, jadi pada hari-hari awal tautan hanyalah tautan. Tidak ada yang lunak dan keras, tidak ada -spilihan. Dan sekarang saya bahkan menggunakan simbolisme sumber-target:

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

Pada tahap ini, ada tautan, tetapi tidak ada yang keras dan lunak, dan ls -ltidak menunjukkan panah, karena tidak ada arah di tautan (keras). "Tautan" pada tahap evolusi unix berarti nama file "B" (entri direktori "B") dalam sistem file menunjuk ke inode yang sama dengan nama file "A" menunjuk ke.

File A dan B "ditautkan" bersama-sama, karena mereka berbagi blok yang sama. Jadi sekarang dengan setiap rm, kernel harus memeriksa: apakah saya menghapus / membebaskan blok file ini pada disk, atau adakah file lain yang terhubung ke blok yang sama? Untuk itu, penghitung tautan digunakan.

Katakanlah Anda ingin menyimpan file besar di / tmp grom yang dihapus dan dilakukan ln /tmp/bigfile. Sekarang Anda memiliki bigfile besar di dir kerja Anda. Setelah membersihkan / tmp dan mencari "asli", Anda dengan senang hati menggunakan blok data yang sama. Anda tidak mendapatkan tautan mati atau menggantung, Anda memiliki file normal. Menunjuk ke tidak ada file tetapi hanya blok sistem file seperti setiap entri dir tidak. Hanya sekarang "membersihkan" / tmp tidak seefektif dulu. Terlihat kosong, dan memang benar, tetapi blok di partisi tidak dibebaskan.

Meskipun tautan keras tidak memakan biaya ruang itu sendiri seperti halnya cp, secara tidak langsung, itu bisa.

Menambahkan ln -ske urutan di atas:

ln -s A B   --- copy only the file's name to "B"   

Sekarang "B", tautan lunak, hanya memiliki string dengan pathname. Ini adalah informasi "lunak". Secara teknis "A" dan "B" tidak berhubungan. Tapi tetap B adalah "tautan" dalam arti baru yang bisa Anda gunakan pathname tersimpan itu sebagai jalan pintas ke "A". Sekarang "tautan ke A" (titik) dan tidak "ditautkan dengan inode file A"

Kedua jenis tautan ini dapat membingungkan tidak hanya manusia tetapi juga kernel / fs. Halaman manual 1971 mencatat: "BUGS: tautan dapat dicadangkan dua kali, dan dipulihkan sebagai file terpisah dengan inode terpisah."

Tautan keras ke direktori (jarang / tidak diizinkan) dapat dengan mudah menyebabkan penyumbatan.

Tautan lunak ke direktori (sangat umum) dapat menyebabkan loop abadi - harus dikenali oleh utilitas / kernel.

Contoh praktis dalam bash

Dimulai dengan file biasa "F" ...

ln F Fhard

... membuat Fhard ukuran yang sama dengan F, tetapi mereka KEDUA muncul sekarang dalam merah gelap TANPA panah di ls -l --color. Karena statmenampilkan "Tautan: 2" sehubungan dengan "Inode: xyz". Hubungan keras F mengubah F sendiri menjadi tautan keras. Keduanya adalah / tetap filetype "file biasa". Tetapi keduanya memiliki inode dengan jumlah tautan di atas 1.

   ln -s F Fsoft

... membuat file kecil "tidak biasa" "Fsoft" dengan filetype "symbolic link" --- bahkan lebih menghemat ruang daripada direktori kosong. A ls -lmenunjukkan tidak ada yang istimewa untuk "F". Untuk Fsoft, ukuran yang ditampilkan adalah 1 byte karena stringnya adalah 'F', dan Fsoft -> Fditampilkan sebagai nama. Tidak perlu mewarnai tautan lunak untuk mengenalinya. Karena dalam bentuk singkat ls -FAnda mendapatkan rantai melingkar @ ditambahkan:Fsoft@

Dengan ls -ltampilannya seperti ini:

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

Fhard memiliki ukuran dan tipe F.

Fsoft memiliki nama F dan panjang nama F sebagai ukuran, dan jenis file yang berbeda.

Pendek ls -sF:

5932 F    5932 Fhard     0 Fsoft@

menambahkan --block-size=1juga tidak menghasilkan ukuran yang sama. Fsoft memiliki ukuran "satu byte, nol blok". F dan Fhard menyimpang secara paralel:

6074368 F  6074368 Fhard    0 Fsoft@

Untuk melihat apakah Fsoft menggantung atau tidak, lsAnda dapat menggunakan warna.

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

sumber
2

Sangat membantu untuk mengingat bahwa nama tautan itu opsional. Jika tidak diberikan, nama dasar target tautan digunakan.

ln -s /path/to/file1 file1

identik dengan menjatuhkan nama tautan sepenuhnya:

ln -s /path/to/file1

Ini tidak masuk akal jika target tautan disebutkan terakhir.

rexkogitans
sumber
1

Pikirkan saja Unix -> AT&T -> tujuan di kanan:

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def
Kaz
sumber
"cp foo bar" berarti "to bar". "Dalam abc def" berarti "ke abc". Jika Anda menyimpan simbol: "to foo". Persis itulah masalahnya.
@ user370539 Itu ismply tidak benar; setelah ln abc def, abcdan defmerupakan objek yang sama; mereka tidak bisa dibedakan. Selain itu, operasi tidak berpengaruh pada abc, selain meningkatkan jumlah tautannya. Tujuannya adalah def. Penunjuk ke objek baru dipasang di deflokasi.
Kaz
@ user370539 Jika tautannya simbolis, ln -s abc defberarti kontennya abcditulis ke lokasi def. abcbahkan tidak harus menyelesaikan apa pun; itu bisa menjadi tautan yang menggantung.
Kaz
Komentar Anda persis ... salah. Seharusnya sebaliknya.
rexkogitans
@rexkogitans Maksud saya adalah konsisten. Jika pesanan adalah "salah" dan harus dibalik, maka harus untuk semua perintah mereka: mv dest src, ln [ -s ] dest src, cp dest src, ...
Kaz
0

Secara pribadi, saya lebih suka untuk tidak mengingat X, lebih memilih untuk mengetahui di mana mencari X ketika saya membutuhkannya. Saya juga penggemar sikap "lebih aman daripada menyesal" jadi saya selalu ingin memeriksa dengan cermat apa yang saya tulis, terutama sebagai root.

Dalam hal ini, jawabannya secara harfiah ada di baris pertama halaman manual:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

Saya tidak akan menyarankan itu jika diperlukan untuk mempelajari halaman manual, tetapi karena itu benar di awal, IMHO itu sepadan dengan 3 detik yang dibutuhkan untuk mengetik man lndan berhenti.

dr01
sumber
-1

Mirip dengan cp, yang secara mental saya baca sebagai "salin ini ke itu", saya membaca perintah ln sebagai "tautan ini ke itu".

jl6
sumber
2
Ini sangat mirip dengan jawaban berperingkat teratas .
Michael
Jadi "In -s AB 'menghubungkan A ke B? Apakah sekarang A -> B atau B -> A? Saya pikir sebagian besar bahkan belum melewati tahap pertama kebingungan. Mereka mengatakan itu sederhana, tetapi itu hanya salah.
-2

Inilah yang saya ingat: Lupakan target. Dengan kata lain, jika saya di dir1 dan ingin membuat symlink di sini ke file1 yang ada di / some / other / dir /, saya hanya akan melakukan:

ln -s /some/other/dir/file1

Anda akan mendapatkan symlink bernama file1 di dir1 yang menunjuk ke / some / other / dir / file1. Dari halaman manual untuk ln:

Di [OPSI] ... TARGET (formulir ke-2) ... Pada formulir ke-2, buat tautan ke TARGET di direktori saat ini.

Perlu diingat bahwa ini hanya berfungsi jika Anda ingin symlink memiliki nama yang sama dengan target (yang kemungkinan besar adalah kasusnya).

Melompat Kelinci
sumber
Adakah yang bisa menjelaskan mengapa ini diturunkan? Saya baru saja menyalin-paste dari halaman manual (dan sesuai dikaitkan). Ini akan membantu orang lain untuk memahami cara memposting di SE. Terima kasih.
Hopping Bunny
saya bisa menjelaskan: ini adalah bentrokan budaya. Jangan khawatir. Periksa jawaban lain, komentar ...
-3

Saya ingin memperluas jawaban @ gary.

Selain anwernya: lnperintah dapat menerima sejumlah argumen sembarang, sehingga Anda dapat membuat beberapa symlink dalam satu permintaan (yang berguna saat Anda membutuhkannya).

  1. Dengan pengetahuan itu, ketika Anda temui ln -s foo bar baz, apa penjelasan paling logis yang argumen artinya apa?
  2. Dengan jawaban # 1, ketika Anda bertemu ln -s foo bar, apa penjelasan paling logis yang argumen artinya?
yegle
sumber
1
Jika Anda memiliki tambahan untuk jawaban gary, harap sarankan sebagai edit. Seperti apa adanya, dua pertanyaan Anda yang tertinggal (hipotetis?) Menjadikan "Jawaban" ini lebih mirip pertanyaan kedua.
Jeff Schaller
-3

Bayangkan sebuah versi lnyang memungkinkan Anda membuat beberapa tautan (simbolik) dalam satu perintah.

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

Itu tidak akan membuat sejak untuk membalikkan itu, karena symlink hanya dapat menunjuk ke satu TARGETper satu dan konvensi baris perintah normal adalah untuk meletakkan bagian berulang di akhir baris perintah, misalnyagrep PAT [FILE]...

jrw32982 mendukung Monica
sumber
-6

" lsmenunjukkan a -> bbegitu ln a b"

Ingatlah bahwa ini salah.

Ya Tuhan
sumber
6
Saya selalu ingat "sesuatu-sesuatu selalu salah". Tapi jalan mana yang salah? Itulah masalahnya. Masalahnya kemudian menjadi tebakan kedua saya sendiri bahkan ketika saya sudah benar. Karena saya tidak bisa mengingat urutan yang benar!
Zhro
Saya pikir saya mengerti apa yang Anda maksud: output dari ls -l: link -> targetdapat membingungkan ide Anda tentang cara mengatur lnbaris perintah. Tetapi saya khawatir itu tidak akan banyak membantu.
sudodus