lnのパラメーターの順序を記憶するためのヒント?


64

私はln何年もシンボリックリンクを書いてきましたが、それでもパラメーターの順序は間違っています。

これは通常私に書いています:

ln -s a b

そして出力を見て自分自身を思い出させます。

私はa -> bそれが実際に反対であるとき、私はそれを読んでいるように常に想像していますb -> a。これは直観に反しているように感じられるので、私は常に自分自身を推測していることがわかります。

正しい順序を覚えておくのに役立つヒントはありますか?


11
時にはそれはあなたがそれを入力するとoutloudそれを言う「へのシンボリックリンクするのに役立ちa、かつそれを呼び出すb
jsotola

2
cpと同じように2番目のパラメーターを作成し、リンクを作成します。ただし、既存のファイルまたはシンボリックリンクを新しいリンクで上書きすることはできないため、間違った方法で取得しても心配はありません。
sudodus


1
「悪者のエイリアス」と考えてください。彼は常に本名で呼ばれ、次にエイリアスで呼ばれます。例:トニーバロニー、別名オスカーマイヤー。または、リンクの場合、ln -sabは「File-aはFile-bとしても知られている」ことを意味します。
スコッティH

1
ln source target。と同じcp source targetmv source target; ...
user207421

回答:


40

私は次を使用します:ln1つの引数形式(マンページにリストされている2番目の形式)があり、ターゲットのみが必要です(lnターゲットを知らなくても動作する方法があるため)ln。現在のディレクトリにリンクを作成します。引数が2つの形式は、引数が1つの形式への追加であるため、ターゲットは常に最初の引数です。


3
宛先/ターゲットパスのないフォームは、POSIX仕様の拡張であることに注意してくださいln
クサラナンダ

1
@kusa:1つの引数の形式での私の答えに1971年のマニュアルがありましたか?posixが1971年にあった場合、posixの拡張機能となるにはどうすればよいですか?---「name2が指定されている場合、リンクにはその名前があります」

@SPあなたが何を言っているのか理解できません。歴史的な実装が何らかの形で現在のPOSIX標準に勝ると言っていますか?
クサラナンダ

1
私も見ます 異なる名前、同じ引数、少なくとも。これらの引数名を持つのはgnuだけだとは思いもしませんでした。

2
ここにはたくさんの良い答えがありました(特に@loa_in_の韻文)が、私はこれを使います。パラメータの順序が一貫している(を無視する-t)と述べると、ほとんど証明のように感じられます。「ln現在のディレクトリにリンクを作成します。2引数形式は1引数形式に追加されるため、ターゲットは常に最初の引数です」。これは、2番目の形式を検討する場合に当てはまることを理解しているので、覚えておくと役立つと思います。
Zhro

85

私は「のlnようなものcpです。「ソース」が最初に来る必要があります。」


20
...などmvmvcpおよびlnすべてが既存のファイルを最初の引数として受け取り、目的の宛先ファイルまたはディレクトリ名を2番目の引数として受け取ります。
ハンスマーティンモスナー

7
それは残念だmemcpystrcpy周りに他の方法を働くなど。
Arkadiusz Drabczyk

6
@ Hans-MartinMosner。ただし、シンボリックリンクを作成する場合、既存のファイルである必要はありません...
ilkkachu

1
@ilkkachuその通りです。例外なしのルールはありません:-)
ハンス・マーティン・モスナー

1
@ArkadiuszDrabczyk一方、memcpy(dest,src,n);マップのようなものはに非常によくマップされdest = src;ます。つまり、ndest(の最初のnバイト)をsrc (の最初のバイト)に等しく設定します。
CVn

10

ほとんどのUnicesはlnコマンドを

ln source target

(ここではオプションなどを省略しています)

例:

  • POSIX標準

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

    ln [-fhLnPs] source [target]
    
  • NetBSDおよびFreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • マックOS

    ln [-Ffhinsv] source_file [target_file]
    
  • Solaris

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

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

GNU lnマニュアルでは、source ターゲットtarget リンク名を呼び出します。

言葉のGNUの選択を無視すると、lnユーティリティは、例えばとセマンティクスの同じ種類を次のmvcpそれにターゲットがから作成されたものであるソース

したがって、

ln -s a b

b指すシンボリックリンクを作成しaます。

また、シンボリックリンクを作成する場合、ソースはシンボリックリンクが指すものを表す単なる文字列であることに注意してください。通常、有用なものを指していることを検証するためのチェックは行われません。

$ 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

5
私は、人々がこれをまったく間違っているという事実について、GNUドキュメントを完全に非難します。彼らの言葉遣いは後知恵で理解できますが、客観的に混乱させます。
コンラッドルドルフ

6
@KonradRudolph、それどころか、GNUの言葉遣いは私にとってスポットのようです。ユーティリティは、どこかを指す名前のリンクを作成します。「リンク名は」ちょっと明白で、「ターゲット」指摘されて何かのための完璧な説明です。逸話として、私はいまだにどちらの方法がln -s a b機能するかを考える必要があり、それはGNUの言葉遣いとは何の関係もありません。:D(ln -si a b不明な場合に実行する方が簡単bです。既に存在する場合は文句を言います。)
ilkkachu

1
@KonradRudolphは、技術的には、ハードリンクの場合に「ターゲット」と呼ぶのは間違っています。なぜなら、それは既存の名前ではなく、実際のターゲットであるiノードだからです。GNUの人々は、一般のユーザーがそれほど詳細に考える必要はないと考えていたのだろうか。
イルカチュウ

@garyの回答のコメントで述べたように、POSIX標準ではターゲットはオプションではないことを指摘するのは興味深いことです。
Zhro

@kusa: "ln -s AB ---ファイル名のみをBにコピーする"を使用して、少し変更されたコンテキストでの解釈を採用しました。あなたの過激な「ハローワールド」の例にも同意できます。「唯一のファイルの名前は」文字列ですちょうど私が少し編集し、多くのことを追加したことをあなたに合図したい。。

7

これが誰かに役立つ場合:私はそれを「ln what where」と考えることに慣れました。これは、最初の引数(「what」)が既存のファイルであり、2番目(「where」)が(リンク)を配置します。他のほとんどの答えの推論とは対照的に、これは記憶の助けとして役立つコマンドを入力しているときに私が精神的に暗唱できる簡潔なフレーズにすぎません。これはおそらく誰にとっても有用ではありませんが、一部の人々に役立つと思われます。

これは、他の標準的なファイル操作コマンドは、同じ規則を使用することができますので、私は同じことを行うことができますcpし、mv


4
私はこれがなぜ投票されたのかを知りたいと思っています。ここに間違っている可能性のあるものはあまりありません-注文などを混ぜましたか?
デビッドZ

私は個人的には、「どこで」は説明なしでまだ明確ではないと考えています。「リンクを指しているリンクは何ですか?」(正しい)または「何かにリンクしているものは何ですか?」(違う)。whereと同じ:「リンクが指す場所はどこですか?」(間違っている)または「リンクを作成する場所」(正しい)。したがって、これは、あなたが自分自身を推測している場合、必ずしもそれほど役に立ちません。ただし、cpとmvを覚えておくと役立ちます。
125_m_125

UNIXコマンドでは、ファイル引数を他の種類の引数の後に含めることを期待しています(grepのように、exmapleの場合)。lnは、指定されたコンテンツを持つ特定のタイプのファイルを作成します。ファイルシステムが何か特別なことを行い、通常、ソースファイルへのパスをその中に置くことは、lnに付随しています。たとえば、1などのシンボリックリンクに最初の行の内容を保存するテキストエディターを作成できます。これは簡単ですが、lnがテキストコンテンツを含むファイルを作成することを強調します。引数の順序が論理的に見えるようにします。
ダニー

@ 125_m_125あなたが提示した別の解釈は私にはあまり意味がありませんが、それは大丈夫です。この記憶の助けは皆のためではありません。
デビッドZ

6

私は最近、この特定のことを覚える素晴らしい方法を聞いた:

古いもの、新しいもの、

借りたもの、青いもの、

そして彼女の靴に6ペンス。

最初の詩はlnの引数が何であるかです:何か古いものとそれに続く新しいディレクトリエントリの名前。


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; 

1971 Unix初版マニュアルから

ある、シンプル、構文形式は。


編集:私は対処する、などのコメントを参照してくださいまた、下部の非常に長い追加を参照してください---ターゲットの代わりにFILEまたはファイル名を入れ 氷山は、ハードとソフトln、それだけではなく先端を。


GNUにlnは次の機能があります。

ln [opt] FILENAME

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

リンク名は必要ありません。ln -s /usr/lib/modulesあなたが取得した後

modules -> /usr/lib/modules

FILENAMEと同じ名前(「ターゲット」または「ソース」)で、まさにあなたがいる場所。選択肢も混乱もありません。

あなたはより厳しいですし、下に作成されたリンクしたい場合は今、別の名前および/または他のどこかに、あなたは追加の名前またはパスとしてその願いを。実際のターゲットが最初になり、余分なファンタジーの新しいリンク名が2番目になります。


または、「ls -lリンクについてはこの矢印表記を知っています。リンクの方向を示す矢印はシェルにありません。したがって、向きを変える必要があります。」

一方向で作成するため、他の方向で使用できます。

(質問に対する回答の終わり)


別のレベルでは、「リンク」という単語自体が、深く隠された二重の意味を持ちます。シンボリックリンクは後で登場したため、初期の頃はリンクは単なるリンクでした。ソフトもハードも-sオプションもありませんでした。そして今、私はソースとターゲットのシンボリズムさえ使用しています:

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

この段階では、リンクはありますが、ハードとソフトls -lはなく、(ハード)リンクには方向がないため、矢印は表示されません。UNIXの進化のその段階での「リンク」は、ファイルシステムのファイル名「B」(ディレクトリエントリ「B」)がファイル名「A」が指しているのと同じiノードを指すことを意味しました。

ファイルAとBは同じブロックを共有しているため、一緒に「リンク」されています。それで、すべてのrmで、カーネルはチェックする必要があります:ディスク上のこのファイルのブロックを削除/解放するか、同じブロックにリンクされた別のファイルがありますか?そのために、リンクカウンターが使用されます。

/ tmp gromの大きなファイルを削除したままにしておきたいとしましょうln /tmp/bigfile。これで、作業ディレクトリに大きな大きなファイルができました。/ tmpをクリーニングし、「オリジナル」を削除した後、同じデータブロックを使用して喜んで続行します。死んだリンクやぶら下がりリンクを取得するのではなく、通常のファイルがあります。すべてのdirエントリが行うようにファイルをブロックせず、ファイルシステムのみを指します。/ tmpの「クリーニング」は、今ほど効果的ではありません。空に見えますが、パーティション上のブロックは解放されません。

ハードリンクは、cpのようにスペース自体を消費しませんが、間接的には可能です。

ln -s上記のシーケンスに追加:

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

現在、ソフトリンク「B」には、パス名を持つ文字列のみが含まれています。これは「ソフト」情報です。技術的には、「A」と「B」は無関係です。しかし、Bは、保存されたパス名を「A」へのショートカットとして使用できるという新しい意味での「リンク」です。これは「Aへのリンク」(ピリオド)であり、「ファイルAのiノードリンク」ではありません

どちらの種類のリンクも、人間だけでなくkernel / fsも混乱させる可能性があります。1971年のマニュアルページには、「バグ:リンクは2回バックアップされ、個別のiノードを持つ個別のファイルとして復元されます。」

ディレクトリへのハードリンク(まれ/許可されていない)は、簡単に詰まる可能性があります。

ディレクトリへのソフトリンク(非常に一般的)は、永遠のループにつながる可能性があります-ユーティリティ/カーネルによって認識される必要があります。

bashの実用例

通常のファイル「F」で始まります...

ln F Fhard

... FhardはFと同じサイズになりますが、両方の矢印はなしで濃い赤で表示されls -l --colorます。stat「Inode:xyz」に関連して「Links:2」が表示されるため。Fをハードリンクすると、F自体がハードリンクになります。両方ともファイルタイプ「通常ファイル」です。ただし、どちらにもリンクカウントが1を超えるiノードがあります。

   ln -s F Fsoft

...ファイルタイプ「シンボリックリンク」を持つ小さな「不規則な」ファイル「Fsoft」を作成します。空のディレクトリよりもさらにスペースを節約できます。A ls -lは「F」に特別なものは何も示しません。Fsoftの場合、文字列が「F」であるため、Fsoft -> F表示されるサイズは1バイトで、名前として表示されます。ソフトリンクを認識するためにソフトリンクを色付けする必要はありません。短い形式でls -Fは、コイルチェーンが@ 追加されるためです。Fsoft@

ではls -l、それは次のようになります。

-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にはFのサイズとタイプがあります。

FsoftにはFの名前とFの名前の長さがサイズとしてあり、異なるファイルタイプがあります。

ショートls -sF

5932 F    5932 Fhard     0 Fsoft@

追加--block-size=1しても同じサイズにはなりません。Fsoftのサイズは「1バイト、ゼロブロック」です。FとFhardは並行して逸脱します。

6074368 F  6074368 Fhard    0 Fsoft@

Fsoftがぶら下がっているかどうかを確認するには、ls色を使用します。

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

2

リンクの名前はオプションであることに注意してください。指定されていない場合は、リンクターゲットのベース名が使用されます。

ln -s /path/to/file1 file1

リンク名を完全に削除するのと同じです:

ln -s /path/to/file1

リンクターゲットが最後に言及された場合、これは意味がありません。


1

Unix-> AT&T->右の宛先を考えてください:

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

「cp foo bar」は「to bar」を意味します。「ln abc def」は「to abc」を意味します。シンボルを保持していた場合:「to foo」。それがまさに問題です。

@ user370539それは事実ではありません。の後ln abc defabcおよびdefは同じオブジェクトです。それらは区別できません。さらに、abcリンクカウントを増やす以外、操作はに影響しません。宛先はdefです。オブジェクトへのポインターがそのdef場所に新しくインストールされます。
カズ

@ user370539リンクがシンボリックの場合、ln -s abc defコンテンツabcがlocationに書き込まれることを意味しますdefabc何にも解決する必要さえありません。宙ぶらりんのリンクになります。
カズ

あなたのコメントは正確に...間違っています。それは逆のはずです。
レックスコギタン

@rexkogitans私のポイントは、それが一貫しているということです。順序が「間違って」であると逆にする必要がある場合、それはすべてのこれらのコマンドのためにする必要があります:mv dest srcln [ -s ] dest srccp dest src、...
カズ

0

個人的には、X を覚えるのを避け、必要なときにX を探す場所を知ることを好みます。私は「ごめんなさいよりも安全」という態度も大好きなので、特にルートとして、自分が書いているものを注意深くチェックするのが好きです。

この場合、答えは文字通りマンページの最初の行にあります。

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

マンページを掘り下げる必要がある場合は提案しませんでしたが、最初から正しいので、入力man lnして終了するのに3秒かかります。


-1

精神的に「これにコピー」と読むcpと同様に、lnコマンドを「これにリンク」と読みます。


2
これは、一流の回答に非常に似ています
マイケル

「ln -s AB 'はAをBにリンクしますか?現在はA-> BまたはB-> Aですか?ほとんどの人は混乱の第一段階さえ通過していないと思います。

-2

これは私がそれを覚えている方法です:ターゲットを忘れてください。言い換えれば、私がdir1にいて、/ some / other / dir /に存在するfile1へのシンボリックリンクをここに作成したい場合、私はただやるでしょう:

ln -s /some/other/dir/file1

/ some / other / dir / file1を指すdir1のfile1というシンボリックリンクを取得します。lnのmanページから:

ln [OPTION] ... TARGET(2番目の形式)... 2番目の形式で、現在のディレクトリにTARGETへのリンクを作成します。

これは、シンボリックリンクにターゲットと同じ名前を付ける場合にのみ機能することに注意してください(ほとんどの場合そうです)。


誰かがこれがなぜ投票されたのか説明してもらえますか?マニュアルページからコピーアンドペーストしました(それに応じて属性付けされています)。他の人がSEに投稿する方法を理解するのに役立ちます。ありがとう。
ホッピングバニー

私は説明することができます:それは文化的な衝突です。心配しないで。他の回答、コメントを確認してください...

-3

@garyの答えを詳しく説明します。

彼の答えに加えて、lnコマンドは任意の数の引数を受け入れることができるため、1回の呼び出しで複数のシンボリックリンクを作成できます(必要なときに便利です)。

  1. その知識があれば、に遭遇するとln -s foo bar baz、どの引数が何を意味する最も論理的な説明は何ですか?
  2. #1の答えで、に遭遇したときln -s foo bar、どの引数が何を意味する最も論理的な説明は何ですか?

1
ゲイリーの回答に追加がある場合は、編集として提案してください。現状では、2つの後続の(仮説?)質問により、この「回答」は2番目の質問のように見えます。
ジェフシャラー

-3

ln1つのコマンドで複数の(シンボリック)リンクを作成できるバージョンを想像してください。

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

シンボリックリンクは一度に1つしか指すことができずTARGET、通常のコマンドラインの規則ではコマンドラインの最後に繰り返し部分を置くことになるため、それを逆にすることはありません。grep PAT [FILE]...


-6

ls示していa -> bそうln a b

これが間違っていることを覚えておいてください。


6
私はいつも「何か-常に間違っている」ことを覚えています。しかし、どの方法が間違っていますか?それが問題です。問題は、私がそれを正しく理解したとしても、私の次の推測になります。実際に正しい順序を思い出せないからです!
Zhro

出力は:私は私はあなたが何を意味するかを理解すると思うls -llink -> target設定する方法のアイデア混乱することができますlnコマンドラインを。しかし、私はそれがあまり役に立たないことを恐れています。
sudodus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.