2つのファイルを動的にリンクし、結果を新しいファイルとして参照する方法は?

2つのファイルを動的にリンクし、結果を新しいファイルとして参照する方法は?

staticEntries.dicとDynamicEntries.dicという2つのファイルをリンクしたいです。名前が示すように、staticEntries.dicの内容は時間の経過とともに変わりませんが(一般的な単語を含む)、逆にDynamicEntries.dicは時間の経過とともに変更される可能性があります(データベースから抽出された略語を含む)。私のエディタでは、これら2つのファイルの内容を含むmydict.dicを提供したいと思います。もちろん、シェルを使ってこれを行うことはできますが、作成したmydict.dicに新しいバージョンのDynamicEntries.dicをリンクする前に、mydict.dicファイルのDynamicEntries.dicコンテンツを置き換える必要があります。 ->他の2つのファイルをリンクするコマンドでmydict.dicファイルを作成したいのですが、どうすればいいのかわかりません。私のエディタが実行または呼び出していないため(おそらく)bashコマンドは使用できません。

以下は簡単な例です。

staticEntries.dicの内容

house
dog
horse

DynamicEntries.dicの内容。このコンテンツはデータベースで作成されるため、時間の経過とともに変更される可能性があります。

EGB38
PD
UH7ZT

mydict.dicの追跡コンテンツ

house
dog
horse
EGB38
PD
UH7ZT

シェルを介してその組み合わせを実行すると、新しいバージョンの動的Entries.dicファイルが生成されたときに問題が発生します。 mydict.dicファイルで重複したエントリをどのように回避できますか?それで、リンクされたコマンドをファイルに入れ、それを辞書ファイルとしてエディタに提供できる一般的なファイルとして参照したいと思います。これが可能かどうか、他のアプローチを取るべきかどうかわかりません。

答え1

名前付きパイプの背後にあるスクリプトを作成して開いて読み取ると、staticEntries.dicとDynamicEntries.dicの内容をダンプできます。パイプは閉じて再び開くまで出力を終了します。

ただし、スクリプトはバックグラウンドで実行中のままにしておき、ログアウト/ログインまたは再起動後に再起動する必要があります。

さらに重要なのは、これがシェルプログラミング初心者のための作業ではないということです。

時には(通常)最も簡単な解決策が最善です。

より簡単な方法は、mydict.dicを他の2つのファイルに依存して定義するMakefileを作成し、必要に応じてmakeを実行して更新することです。あるいは、シェルスクリプト - Makefileの利点は、cronで実行することもでき、ソースファイルの1つが変更された場合は、ターゲットファイル(mydict.dic)のみを更新することです。

たとえば、

#!/usr/bin/make -f

all: mydict.dic

mydict.dic: staticEntries.dic dynamicEntries.dic
        cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
        mv mydict.dic.tmp mydict.dic

行は空白ではなくタブでcat始まります。mv

リンクされたファイルは最初に一時ファイルとして生成され、次に所定の場所に移動されるため、古いファイルを新しいファイルに置き換えることはアトミック操作です。アイデアは、ファイルを使用するたびに完全な古いバージョンまたは完全な新しいバージョンを持つことになりますが、新しいバージョンの部分バージョンは決して持たないことです。

ソース.dicファイルが別のディレクトリにある場合は、ファイルのフルパス名を指定する必要があります。

答え2

動的辞書が変更された場合は、小さなcronjobを実行してファイルを再リンクします。まず、ファイルの変更を監視する小さなスクリプトを作成します。

#!/usr/bin/env bash
while true; do
  inotifywait -e modify path/to/dynamicEntries.dic
  sort path/to/dynamicEntries.dic /path/to/staticEntries.dic | 
    uniq > mydict.dic.tmp
  sleep 1
done

スクリプトをdict.sh実行可能にする別の名前で保存(chmod a+x dict.shし、再起動時にスクリプトを起動するcrontabを作成します。次の行を実行しcrontab -eて貼り付けます。

@reboot /path/to/dict.sh

これで、動的辞書が変更されるたびに手動で実行することなく、辞書が自動的に更新されます。

答え3

シェルからファイルをリンクするのは簡単です。

cat staticEntries.dic dynamicEntries.dic

これにより、両方のファイルの内容が印刷されますstdout。結果を新しいファイルにリダイレクトするには:

cat staticEntries.dic dynamicEntries.dic > mydict.dic

しかし、たぶんそれはあなたが探しているものではないかもしれません...?私はあなたが解決しようとしている問題をよく理解していないと言いたいと思います。

答え4

編集者に話す方法を変更できます。を使用すると仮定すると、viシェルスクリプトを作成できますeditmydictionary.sh

cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
vi mydict.dic.tmp

そのため、実行するたびにeditmydictionary.sh両方のファイルの最新バージョンを編集します。

関連情報