-1

私は最近本当に自分自身を台無しにしました。2 つのファイルの内容を交換する関数があります。

function swap()         
{
    local TMPFILE=tmp.$$
    mv "$1" "$TMPFILE"
    mv "$2" "$1"
    mv "$TMPFILE""$2"
}               ^

ご覧のとおり、ニンジンが指している場所のすぐ近くにスペースがありません。その結果、次のコマンドを実行します。

$ swap important.txt not-important.txt

important.txt が not-important.txt によって上書きされ、important.txt がローカルの bash 変数/ファイルの深淵に送信されます。

ディスク上の生データをスクレイピングする以外にオプションはありますか?

$ grep -a -A1000 -B1000 "some text from important.txt" /dev/disk0
4

1 に答える 1

2

質問は意味がありません.ローカル変数で行われるため、Bashはファイルを自動的に削除することはありません. 変数は文字通り、ファイルの名前を保持する文字列にすぎません。これは意味のあるファイル ハンドルではありません。(Bash、リダイレクトを使用してファイルを開き、関連するFDまたはファイル記述子を追跡することにより、実際のファイルハンドルをサポートしますが、ここのコードは何もしません)。


つまり、次のようになります。

mv "$1" "$TEMPFILE"

ファイルの名前を、TEMPFILE 変数内に既に保存されている名前に変更します。直前の行で割り当てているため、その名前が何であるかがわかります。

local TMPFILE=tmp.$$

$$は現在のシェルの PID (またはプロセス ID)mv "$1" "$TEMPFILE"ですmv "$1" "tmp.$$"ファイルの内容はローカル変数に保存されません。ファイルの名前だけがそこに保存されます。Bash はそのファイル自体を削除しませんが、同じ ID を持つプロセスから同じディレクトリで関数を再度呼び出すと、同じ一時ファイル名が選択されるため、ファイルの以前の内容が上書きされます。


したがって、 function の場合、はスクリプトを実行している bash インスタンスの PID であるというswap形式の名前を持つファイルをディスク上に残します。コンテンツがまだ存在する場合は、そのフォームに一致する名前のファイルになります。tmp.######

于 2014-09-29T00:50:10.797 に答える