作業用UNIXディレクトリ内のチルダ(〜)


22

だから、私はUNIX環境で働いており、UNIXホームから何マイルも離れた作業ディレクトリ内にがあることに気付きました~

今、過去に一度、私はrm -rf ~自分の作業ディレクトリから行って、ホームディレクトリを完全に消去することになり、ITを巻き込まなければなりませんでした。

二度とやりたくない。同時に、知りたい

  1. ~作業ディレクトリに作成されるのはなぜですか?保存中の指の滑りが間違って:w!いますか(しかし、どうなり:w~ますか?!!)

  2. チェックインする前に、p4が認識していない余分なファイルまたはフォルダーを探すスクリプトがあるため、def ~により問題が発生する可能性があります。では~、作業ディレクトリからを削除し、同時に自宅を消去しないようにするにはどうすればよいですか?

del代わりに使用するというバックアップコマンドがありrm -rfます。一時的な場所に物を置くだけです。私はそれを使用して、を取り除くことができました~。しかし、私はこれがなぜ起こるのか、どのようにそれを削除できるのかを知ることにもっと興味がありますか?


通常、シェルはパスの先頭にある〜をホームディレクトリに置き換えます。完全なパス/home/yourUserName/~を使用して、というディレクトリにアクセスします~
ジョフェル14年

〜otheruser / fileは、完全を期すために、他のユーザーのホームディレクトリを参照するために使用できます。
godlygeek 14年

いたずらのように見えます!
Xolve

回答:


36

引用するか:

rm -i '~'
rm -i "~"
rm -i \~

または、ベース名だけではなくパスで参照します。

rm -i ./~
rm -i /path/to/~

面白いに見える単一文字の名前であるにもかかわらず、なお、これは概念的には違いはありませんあなたが名前のファイルを作成した場合よりもSOME$PATH実行してし

touch 'SOME$PATH'

そして、次のようにして削除しようとしました:

rm -i SOME$PATH

警告:変数 SOME$PATH はここの例のために引用されていません。通常は引用符で囲まれます 'SOME$PATH'

どちらの場合も、シェルは指定した名前を展開するため、それを防ぐ必要があります。

またrm -rf、ファイルの削除には使用しないでください!全体の目的rm -rは、rmディレクトリを削除してもよいことを伝えることです。ファイルを削除しようとして誤ってディレクトリ全体を削除したくない場合は、習慣的にパスしないでください-r


12
これをテストしました。:w~vimでは、というファイルを作成しました~rm ~返されましたcannot remove /home/seth it is a directoryファイルをrm "~"削除しました。下線を引くためだけに自動的に渡さないでください-rf
セス14年

4
デフォルトで暴力的なオプションを省略することを推奨する場合は、+ 1。これはkill -9、私が見たデフォルトで行うことに似ています。
セラダ14年

この例rm -i $FOOは、例のために変数を意図的に引用していないが、それでもrm、引数として引用されていない変数を含むシェルの例を示すと、コンテキストに関係なく、非常に悪いです。私はそれが証明されることさえあると確信しています:)私はいくつかのメモを追加します-しかし、多分あなたは少し例を変更できますか?
フォルカーシーゲル14年

@VolkerSiegel、要点-私はあなたの編集の一部を取りましたが、脚注は少し重く感じられました。また、問題が発生する可能性がさらに低い変数名に切り替えました。ほとんどの人は、ファイルSOME/bin:/usr/binシステムのどこにも名前の付いたファイルを持っていません。:)
godlygeek 14年

はい、よさそうです!(私はほとんど答えようとしていました:何?ヘビーハンド?ライブで実際のクォートの問題を経験したことがありますか?間違った例がなくても理解する!)
Volker Siegel 14年

1

ls ~〜がホームディレクトリへのショートカットであるため、チルダは、コンテキストで単独で使用される場合、ホームディレクトリをリストします。その場合ls ~brown、brownのホームディレクトリの内容がリストされます。

VIMは、特に指示がない限り、変更されたファイルのバックアップコピーmyFile myFile〜を作成します。

この動作はバックアップを作成するので適切ですが、必要ない場合は、.vimrcファイルに追加しますvi ~/.vimrc

そしてもちろん、他の人が言ったように、〜というファイルがある場合は、文字を\〜としてエスケープするだけです

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

これは、タイプミスによって影響を受ける可能性があります。あなたのTERM=xterm設定が私のようなものである場合、キーボード上の実質的にすべてのファンクションキーは次のようなエスケープシーケンスを送信します...

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

出力の半分以上が私のマシンのチルダエスケープをinfocmp -1含んでいます-そしてそれらのほとんどが何をするのか理解するのに途方に暮れています。ほとんどの場合、少なくとも実際には文字列のエスケープされた部分を食べ、チルダだけを残すことを知っています。~zsh~

たとえばecho、「<space>then」F6と入力してから<return>印刷します...

/home/mikeserv

送信される実際のエスケープシーケンスは...

kf6=\E[17~

興味深いことに、>文字を含むこれらのエスケープシーケンスは他にもあります。

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

これらは一般的に使用されるエスケープ-リセットおよび初期化文字列です。対話型シェルが入力を待機しているときに何らかのキーボードまたはボタンの破壊がドロップされると~、ファイルシステム全体でランダムに切り捨てられたファイルが発生することを想像するのは難しくありません。少なくとも、それは時々私の上に現れます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.